Как правильно перегрузить операторы +=, -=, =
У меня есть класс рисующий прямоугольник, как правильно применить к нему эти операторы, чтобы они изменяли размер?
Помогите пожалуйста
Перегрузка операторов
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Предположим у тебя есть класс 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Спасибо! Сейчас буду пробовать. =)
Код: Выделить всё
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
- Откуда: Крым, Севастополь
- Контактная информация:
В закоментированном коде есть ошибки, а так вроде нет. В чём проблема именно? Пиши, не стесняйся. Я же не умею читать мысли
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
как это вызвать в классе движения? и если можно то код Enter'a 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 (int x, int y, int r, short c,int d,int h); зачем столько параметров кругу
и решается она так
клас точка от него окружность, линия, прямоугольник и т.д.
функция отображения и движения виртуальная и переопределяется в каждом потомке, а если надо что бы движение с прорисовкой было, то задачу полностью опишите.
И массив объектов надо хранить которые на экране... и бегая по нему рисовать все фигуры.
а это класс Circle (int x, int y, int r, short c,int d,int h); зачем столько параметров кругу
Нужно к выложенному коду написать перегрузку операторов += -= и =
Там я начинал маленько, но как закончить не знаю.
Помогите =)
Там я начинал маленько, но как закончить не знаю.
Помогите =)
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Balbec, ты можешь конкретно указать что именно у тебя не получается? Мы не можем тебе помочь пока не узнаем в чём именно требуется помощь. Неужели это не понятно?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.