Министерство образования и науки рф
Санкт-Петербургский государственный электротехнический Университет «ЛЭТИ»
кафедра математического обеспечения ЭВМ
Отчет
по лабораторной работе №1
«Программирование контейнерных классов»
по дисциплине
«Объектно-ориентированные технологии разработки программного обеспечения»
Выполнил: студент гр. 3341 Рыжок М.С.
Проверил : доцент Спицин А.В.
Санкт-Петербург 2007
1. Разработка программ в среде MS Visual C++.
Настройка среды. Выполнение индивидуального задания.
Откомпилировать и выполнить проект TrialRun.
Результат компиляции: TrialRun.exe - 0 error(s), 0 warning(s)
Результат выполнения представлен на рисунке 1.
Рисунок 1
Индивидуальное задание:
Написать классы для создания графических объектов: окружность, эллипс, текст, текст в эллипсе.
Классы должны иметь общий абстрактный базовый класс Shape с чистыми виртуальными функциями.
Необходимо использовать множественное наследование. В классах должны быть предусмотрены виртуальные функции для вывода информации об объектах в поток, а Shape должен иметь дружественный перегруженный оператор <<.
Исходный текст должен быть разделен на три файла .h, .cpp и .cpp с тестовой программой.
Иерархия классов представлена на рисунке 2
Базовый чисто абстрактный класс Shapeопределяет интерфейс.
Класс ShapePositionреализует некоторые методы интерфейса и определяет методы работы с заданием и изменением позиции в рабочей области.
Наследование CCircleиCTextотShapePositionсделано виртуальным, так как классCEllipseTxtмножественно наследован отCCircleиCText. Виртуальное наследование позволяет избежать двойного включения базового класса,
Объявления всех классов находятся в файлах с расширением .h, определение всех классов кромеShapeнаходятся в файлах с расширением .cpp.
Тестовая программа в файле TestProgram.cpp.
Текст классов и тестовой программы
Файл Shape.H
class Shape
{
public:
virtual int getNumType()=0;
virtual void display(std::ostream& os) = 0;
virtual int GetX() const=0;
virtual int GetY() const=0;
virtual void SetX(int _X)=0;
virtual void SetY(int _Y)=0;
virtual void Move(int dx,int dy)=0;
virtual ~Shape(){}
private:
friend std::ostream& operator<<(std::ostream& os, Shape* ob)
{
ob->display(os);
return os;
}
};
Файл ShapePosition.h
class ShapePosition:public Shape
{ int X;
int Y;
public:
ShapePosition();
ShapePosition(int _X,int _Y);
int GetX() const;
int GetY() const;
void SetX(int _X);
void SetY(int _Y);
void Move(int dx,int dy);
};
Файл ShapePosition.cpp
class ShapePosition:public Shape
{ int X;
int Y;
public:
ShapePosition();
ShapePosition(int _X,int _Y);
int GetX() const;
int GetY() const;
void SetX(int _X);
void SetY(int _Y);
void Move(int dx,int dy);
};
Файл CCircle.h
class CCircle : virtual public ShapePosition
{
int XRad;
public:
CCircle();
CCircle(int _X, int _Y, int _XRad);
void SetXRad(int _XRad);
int GetXRad() const;
double GetArea() const;
int getNumType();
void display(std::ostream& x);
virtual ~CCircle();
};
Файл CCircle.cpp
CCircle :: CCircle():ShapePosition()
{ XRad = 0; }
CCircle :: CCircle(int _X, int _Y, int _XRad):ShapePosition(_X,_Y)
{ XRad = _XRad; }
CCircle ::~CCircle()
{}
void CCircle :: SetXRad(int _XRad)
{ XRad = _XRad;}
int CCircle :: GetXRad() const
{
return XRad;
}
double CCircle :: GetArea() const
{
return M_PI * XRad * XRad;
}
int CCircle :: getNumType()
{
return 2;
}
void CCircle ::display(ostream &os)
{
os << "Class CCircle Information :" << endl <<
"X :" << GetX() << endl <<
"Y :" << GetY() << endl <<
"Radius :" << GetXRad() << endl <<
"Area :" << GetArea() << endl;
}