[ Pobierz całość w formacie PDF ]
{
float m_dx;
float m_dy;
public:
CRectangle(float x, float y, float dx, float dy) : CShape(x,y)
{
m_dx=dx;
m_dy=dy;
}
virtual void Draw();
};
class CEllipse:public CShape
{
float m_rx;
float m_ry;
public:
CEllipse(float x, float y, float rx, float ry) : CShape(x,y)
{
m_rx=rx;
m_ry=ry;
}
virtual void Draw();
};
void CShape::Draw()
{
}
52
void CLine::Draw()
{
printf("Rysuję odcinek od punktu (%f, %f) do punktu (%f, %f)\n",
m_x,m_y,m_x2,m_y2);
}
void CRectangle::Draw()
{
printf("Rysuję prostokąt o środku (%f, %f) i wielkości %f, %f\n",
m_x,m_y,m_dx,m_dy);
}
void CEllipse::Draw()
{
printf("Rysuję elipsę o środku (%f, %f) i promieniach (%f, %f)\n",
m_x,m_y,m_rx,m_ry);
}
16 Metody i klasy abstrakcyjne
Jeśli w przyszłym programie nigdy nie pojawi się obiekt klasy CShape, a jest to bardzo
prawdopodobne, można uniknąć definiowana pustej metody CShape::Draw. Tą meto-
dę można zadeklarować jako metodę abstrakcyjną. W tym celu po nagłówku metody
umieszczamy znak = (równa się) a po nim 0 (zero).
class CShape
{
protected:
float m_x;
float m_y;
public:
CShape(float x, float y) { m_x=x; m_y=y; }
virtual void Draw()=0;
};
Z dalszej części programu usuwamy definicję motody CShape::Draw().
Klasa, która ma chociaż jedną metodę abstrakcyjną jest nazywana klasą abstrakcyjną.
Kompilator wykaże błąd jeśli spróbujemy zadeklarować obiekt klasy abstrakcyjnej.
Po tych wszystkich zmianach uszlachetniających bardzo prosto obliczyć najmniejszy
prostokąt otaczający wszystkie figury. Dzieki metodom wirtualnym bedzię to można zro-
bić w jednej pętli operującej na tablicy niejednorodnych obiektów (ale o wspólnej klasie
bazowej). W tym celu wzbogacamy klasę bazową o metodę Box, która będzie zwracać
prostokąt otaczający pojedynczą figurę. Będzie to oczywiście metoda wirtualna.
#include
class CShape
{
protected:
float m_x;
float m_y;
public:
53
CShape(float x, float y) { m_x=x; m_y=y; }
virtual void Draw()=0;
virtual void Box(float &x1, float &y1, float &x2, float &y2);
};
class CLine:public CShape
{
float m_x2;
float m_y2;
public:
CLine(float x, float y, float x2, float y2) : CShape(x,y)
{
m_x2=x2;
m_y2=y2;
}
virtual void Draw();
virtual void Box(float &x1, float &y1, float &x2, float &y2);
};
class CRectangle:public CShape
{
float m_dx;
float m_dy;
public:
CRectangle(float x, float y, float dx, float dy) : CShape(x,y)
{
m_dx=dx;
m_dy=dy;
}
virtual void Draw();
virtual void Box(float &x1, float &y1, float &x2, float &y2);
};
class CEllipse:public CShape
{
float m_rx;
float m_ry;
public:
CEllipse(float x, float y, float rx, float ry) : CShape(x,y)
{
m_rx=rx;
m_ry=ry;
}
virtual void Draw();
virtual void Box(float &x1, float &y1, float &x2, float &y2);
};
void CShape::Box(float &x1, float &y1, float &x2, float &y2)
{
x1=m_x; y1=m_y; x2=m_x; y2=m_y;
}
void CLine::Draw()
{
printf("Rysuję odcinek od punktu (%f, %f) do punktu (%f, %f)\n",
m_x,m_y,m_x2,m_y2);
}
54
void CLine::Box(float &x1, float &y1, float &x2, float &y2)
{
x1=m_x; y1=m_y; x2=m_x2; y2=m_y2;
}
void CRectangle::Draw()
{
printf("Rysuję prostokąt o środku (%f, %f) i wielkości %f, %f\n",
m_x,m_y,m_dx,m_dy);
}
void CRectangle::Box(float &x1, float &y1, float &x2, float &y2)
{
x1=m_x-m_dx/2; y1=m_y-m_dy/2; x2=m_x+m_dx/2; y2=m_y+m_dy/2;
}
void CEllipse::Draw()
{
printf("Rysuję elipsę o środku (%f, %f) i promieniach (%f, %f)\n",
m_x,m_y,m_rx,m_ry);
}
void CEllipse::Box(float &x1, float &y1, float &x2, float &y2)
{
x1=m_x-m_rx; y1=m_y-m_ry; x2=m_x+m_rx; y2=m_y+m_ry;
}
#pragma argsused
int main(int argc, char **argv)
{
CShape *figury[10];
int i;
float xmin,ymin,xmax,ymax;
float x1,y1,x2,y2;
figury[0]=new CLine(10,10,30,40);
figury[1]=new CRectangle(50,50,25,35);
figury[2]=new CEllipse(40,40,10,20);
for (i=0; i
figury[i]->Draw();
figury[0]->Box(xmin,ymin,xmax,ymax);
for (i=1; i
{
figury[i]->Box(x1,y1,x2,y2);
if (x1
if (x2>xmax) xmax=x2;
if (y1
if (y2>ymax) ymax=y2;
}
printf("Wszystkie figury mieszczą się w obszarze (%f,%f)-(%f,%f)\n",
xmin,ymin,xmax,ymax);
for (i=0; i
55
delete figury[i];
return 0;
}
17 Programy wielomodułowe
Programu obiektowe to zazwyczaj większe programy. Pisanie całego programu w jed-
[ Pobierz całość w formacie PDF ]