Перегрузка операторов

Модераторы: Romeo, Hawk, Absurd, WinMain, DeeJayC

Аватара пользователя
Balbec
Сообщения: 34
Зарегистрирован: 15 янв 2008, 20:22

Перегрузка операторов

Сообщение Balbec » 24 мар 2008, 10:42

Как правильно перегрузить операторы +=, -=, =
У меня есть класс рисующий прямоугольник, как правильно применить к нему эти операторы, чтобы они изменяли размер?
Помогите пожалуйста ;)

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Re: Перегрузка операторов

Сообщение Romeo » 24 мар 2008, 11:35

Предположим у тебя есть класс CRect. В этом случае тебе нужно создать такой фрагмент кода внутри класса CRect.

Код: Выделить всё

CRect& operator += (int nSize)
{
   // здесь увеличиваешь размер на nSize
   return *this;
}

CRect& operator -= (int nSize)
{
   // здесь уменьшаешь размер на nSize
   return *this;
}

CRect& operator = (const CRect& r)
{
   // здесь присваиваешь все поля прямоугольника r текущему объекту-прямоугольнику.
   return *this;
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Аватара пользователя
Balbec
Сообщения: 34
Зарегистрирован: 15 янв 2008, 20:22

Re: Перегрузка операторов

Сообщение Balbec » 24 мар 2008, 11:43

Спасибо! Сейчас буду пробовать. =)

Аватара пользователя
Balbec
Сообщения: 34
Зарегистрирован: 15 янв 2008, 20:22

Re: Перегрузка операторов

Сообщение Balbec » 24 мар 2008, 12:13

Код: Выделить всё

class rect
{protected:
	int d,h;
	int x,y,cvet;
 public:
	rect (int x, int y, int d, int h, short c);
	virtual void Print (const c=-1);
	int  getx();
	int  gety();
	int  getCvet();
	void Change   (int x0,int y0);
	rect&operator -= (int Size);
	rect&operator += (int Size);
	//rect&operator =  (int Size);
 };
rect&rect:: operator += (int Size)
 {d=d+Size; h=h+Size; return *this;}


rect&rect:: operator -= (int Size)
 {d=d-Size; h=h-Size; return *this;}

/*rect&rect : :o perator = (int Size)
{ x=1; y=1; a.Print();}    */
Вот мой код. Можете подсказать где ошибся?

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Re: Перегрузка операторов

Сообщение Romeo » 24 мар 2008, 13:01

В закоментированном коде есть ошибки, а так вроде нет. В чём проблема именно? Пиши, не стесняйся. Я же не умею читать мысли :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Аватара пользователя
Balbec
Сообщения: 34
Зарегистрирован: 15 янв 2008, 20:22

Re: Перегрузка операторов

Сообщение Balbec » 24 мар 2008, 13:07

как это вызвать в классе движения? и если можно то код Enter'a 13 не подходит =)
Могу послать весь код =)

Аватара пользователя
Balbec
Сообщения: 34
Зарегистрирован: 15 янв 2008, 20:22

Re: Перегрузка операторов

Сообщение Balbec » 24 мар 2008, 13:13

Код: Выделить всё

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
#include <bios.h>
#include <iostream.h>
#include <string.h>

class rect
{protected:
	int d,h;
	int x,y,cvet;
 public:
	rect (int x, int y, int d, int h, short c);
	virtual void Print (const c=-1);
	int  getx();
	int  gety();
	int  getCvet();
	void Change   (int x0,int y0);
	rect&operator -= (int Size);
	rect&operator += (int Size);
	//rect&operator =  (int Size);
 };

class Circle :p ublic rect
{
 protected:
	int r;
 public:
	Circle (int x, int y, int r, short c,int d,int h);
	virtual void Print (const c=-1);
	int getR();
	Circle&operator -= (int Size);
	Circle&operator += (int Size);
	//Circle&operator =  (int Size);
};

class action
{   public :
	 void draw  (rect *a);
	 void clear (rect *a);
	 void move  (rect *a,int dX, int dY);
};

rect::rect(int a, int b, int razmer,int dlina, short c)
{
   x=a;
   y=b;
   d=razmer;
   h=dlina;
   cvet=c;
}
Circle::Circle(int x,int y, int e, short cvet,int d,int h):rect(x,y,d,h,cvet)
{
 r=e;
}
void rect::Change(int dx, int dy)
{   x+=dx;
    y+=dy;
}

int rect::getx()
{
   return x;
}

int rect::gety()
{
   return y;
}

int rect::getCvet()
{
   return cvet;
}
int Circle::getR()
{
 return r;
}

void rect::Print(const int c)
{
if (c == -1)
  setfillstyle(1,cvet);
  else setfillstyle(1,c);
  bar(x-d, y-h, x+d, y+h);
}

void Circle::Print(const int c)
{
rect::Print(c);
if (c == -1)
 { setcolor (cvet);
 circle(x,y,r);}
  else {setcolor (c);
   circle(x,y,r);}
}

void action::draw(rect *a)
{
  a->Print();
}

void action::clear(rect *a)
{
  int color = getbkcolor();
  a->Print(color);
}

void action::move(rect *a,int dx,int dy)
{
  this -> clear(a);
  a->Change(dx,dy);
  this -> draw(a);
}

rect&rect:: operator += (int Size)
 {d=d+Size; h=h+Size; return *this;}


rect&rect:: operator -= (int Size)
 {d=d-Size; h=h-Size; return *this;}

/*rect&rect : :o perator = (int Size)
{ x=1; y=1; a.Print();}    */

Circle&Circle:: operator += (int Size)
 {d=d+Size; h=h+Size; r=r+Size; return *this;}


Circle&Circle:: operator -= (int Size)
 {d=d-Size; h=h-Size; r=r+Size; return *this;}

/*Circle&Circle : :o perator = (int Size)
{ x=1; y=1; a.Print();}    */


class My
{
public:
void Dvij();
};

void My: :D vij()
{ int gdriver=DETECT, gmode, errorcode;
	initgraph(&gdriver, &gmode, " ");
	int x=getmaxx()/2,y=getmaxy()/2;
	int dX=10;
	int ddX=-10;
	int ddY=-10;
	int dY=10;
	int shirina=50;
	int visota=30;
	int z=70;
	rect *prow1;
	action v;
	cout<<"Bazovii ili naslednic?\n";
	int vibor;
	cin>>vibor;
	if(vibor==1)
	{ prow1=new rect (x,y,shirina,visota,5);
	  prow1->Print();}
	else
	{ prow1=new Circle(x,y,z,1,shirina,visota);
	  prow1->Print();}
	    int m;
	    while (m!=283)
	    {
	    m=bioskey(0);
	    if (m==20480)     { v.move(prow1,0,dY);}
	    if (m==19712)     { v.move(prow1,dX,0);}
	    if (m==18432)     { v.move(prow1,0,ddY);}
	    if (m==19200)     { v.move(prow1,ddX,0);}
	    if (m==13)
	    {
	    cout<<"Vvedite trebyemyu operaciu: \n";
	    char op[3];
	    cin >>op;
	   /* if(op=='+=') {;}
	    if(op=='-=') {;}
	    if(op=='=')  {;}    */
	    }
	    }
}

void main()
{
My obj;
obj.Dvij();
}
Вот он весь код! и вот к классу Circle и rect надо написать перегрузку операторов.

airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

Re: Перегрузка операторов

Сообщение airyashov » 24 мар 2008, 13:16

вот это код, вообще-то классическая задача на ООП.
и решается она так
клас точка от него окружность, линия, прямоугольник и т.д.
функция отображения и движения виртуальная и переопределяется в каждом потомке, а если надо что бы движение с прорисовкой было, то задачу полностью опишите.
И массив объектов надо хранить которые на экране... и бегая по нему рисовать все фигуры.

а это класс Circle (int x, int y, int r, short c,int d,int h); зачем столько параметров кругу

Аватара пользователя
Balbec
Сообщения: 34
Зарегистрирован: 15 янв 2008, 20:22

Re: Перегрузка операторов

Сообщение Balbec » 24 мар 2008, 13:29

Нужно к выложенному коду написать перегрузку операторов += -= и =
Там я начинал маленько, но как закончить не знаю.
Помогите =)

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Re: Перегрузка операторов

Сообщение Romeo » 24 мар 2008, 14:20

Balbec, ты можешь конкретно указать что именно у тебя не получается? Мы не можем тебе помочь пока не узнаем в чём именно требуется помощь. Неужели это не понятно?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Ответить