Создание простых динамических структур данных
· Должны иметь общий виртуальный метод Print, печатающий параметры фигуры и ее тип в стандартный поток вывода cout.
· Должный иметь общий виртуальный метод расчета площади фигуры – Square.
· Должны иметь конструктор, считывающий значения основных параметров фигуры из стандартного потока cin.
· Должны быть расположенны в раздельных файлах: отдельно заголовки (.h), отдельно описание методов (.cpp).
Программа должна позволять вводить фигуру каждого типа с клавиатуры, выводить параметры фигур на экран и их площадь.
Полезный пример
Данный пример демонстрирует основные возможности языка C++, которые понадобится применить в данной лабораторной работе. Пример не является решением варианта лабораторной работы.
Листинг файла Figure. h
#ifndef FIGURE_H
#define FIGURE_H
class Figure {
public:
virtual double Square() = 0;
virtual void Print() = 0;
};
#endif /* FIGURE_H */
Листинг файла Triangle. h
#ifndef TRIANGLE_H
#define TRIANGLE_H
#include <cstdlib>
#include <iostream>
#include "Figure. h"
class Triangle : public Figure{
public:
Triangle();
Triangle(std::istream &is);
Triangle(size_t i, size_t j, size_t k);
Triangle(const Triangle& orig);
double Square() override;
void Print() override;
virtual ~Triangle();
private:
size_t side_a;
size_t side_b;
size_t side_c;
};
#endif /* TRIANGLE_H */
Листинг файла Triangle. cpp
#include "Triangle. h"
#include <iostream>
#include <cmath>
Triangle::Triangle() : Triangle(0, 0, 0) {
}
Triangle::Triangle(size_t i, size_t j, size_t k) : side_a(i), side_b(j), side_c(k) {
std::cout << "Triangle created: " << side_a << ", " << side_b << ", " << side_c << std::endl;
}
Triangle::Triangle(std::istream &is) {
is >> side_a;
is >> side_b;
is >> side_c;
}
Triangle::Triangle(const Triangle& orig) {
std::cout << "Triangle copy created" << std::endl;
side_a = orig. side_a;
side_b = orig. side_b;
side_c = orig. side_c;
}
double Triangle::Square() {
double p = double(side_a + side_b + side_c) / 2.0;
return sqrt(p * (p — double(side_a))*(p — double(side_b))*(p — double(side_c)));
}
void Triangle::Print() {
std::cout << "a=" << side_a << ", b=" << side_b << ", c=" << side_c << std::endl;
}
Triangle::~Triangle() {
std::cout << "Triangle deleted" << std::endl;
}
Листинг файла main. cpp
#include <cstdlib>
#include "Triangle. h"
int main(int argc, char** argv) {
Figure *ptr = new Triangle(std::cin);
ptr->Print();
std::cout << ptr->Square() << std::endl;
delete ptr;
return 0;
}
Лабораторная работа №2
Цель работы
Целью лабораторной работы является:
· Закрепление навыков работы с классами.
· Создание простых динамических структур данных.
· Работа с объектами, передаваемыми «по значению».
Задание
Необходимо спроектировать и запрограммировать на языке C++ класс-контейнер первого уровня, содержащий одну фигуру ( колонка фигура 1), согласно вариантов задания (реализованную в ЛР1).
Классы должны удовлетворять следующим правилам:
· Требования к классу фигуры аналогичны требованиям из лабораторной работы 1.
· Классы фигур должны иметь переопределенный оператор вывода в поток std::ostream (<<). Оператор должен распечатывать параметры фигуры (тип фигуры, длины сторон, радиус и т. д).
· Классы фигур должны иметь переопределенный оператор ввода фигуры из потока std::istream (>>). Оператор должен вводить основные параметры фигуры (длины сторон, радиус и т. д).
· Классы фигур должны иметь операторы копирования (=).
· Классы фигур должны иметь операторы сравнения с такими же фигурами (==).
· Класс-контейнер должен соджержать объекты фигур “по значению” (не по ссылке).
· Класс-контейнер должен иметь метод по добавлению фигуры в контейнер.
· Класс-контейнер должен иметь методы по получению фигуры из контейнера (опеределяется структурой контейнера).
· Класс-контейнер должен иметь метод по удалению фигуры из контейнера (опеределяется структурой контейнера).
· Класс-контейнер должен иметь перегруженный оператор по выводу контейнера в поток std::ostream (<<).
· Класс-контейнер должен иметь деструктор, удаляющий все элементы контейнера.
· Классы должны быть расположенны в раздельных файлах: отдельно заголовки (.h), отдельно описание методов (.cpp).
Нельзя использовать:
· Стандартные контейнеры std.
· Шаблоны (template).
· Различные варианты умных указателей (shared_ptr, weak_ptr).
Программа должна позволять:
· Вводить произвольное количество фигур и добавлять их в контейнер.
· Распечатывать содержимое контейнера.
· Удалять фигуры из контейнера.
Полезный пример
Данный пример демонстрирует основные возможности языка C++, которые понадобится применить в данной лабораторной работе. Пример не является решением варианта лабораторной работы.
Листинг Файла TStack. h
#ifndef TSTACK_H
#define TSTACK_H
#include "Triangle. h"
#include "TStackItem. h"
class TStack {
public:
TStack();
TStack(const TStack& orig);
void push(Triangle &&triangle);
bool empty();
Triangle pop();
friend std::ostream& operator<<(std::ostream& os, const TStack& stack);
virtual ~TStack();
private:
TStackItem *head;
};
#endif /* TSTACK_H */
Листинг Файла TStack. cpp
#include "TStack. h"
TStack::TStack() : head(nullptr) {
}
TStack::TStack(const TStack& orig) {
head = orig. head;
}
std::ostream& operator<<(std::ostream& os, const TStack& stack) {
TStackItem *item = stack. head;
while(item!=nullptr)
{
os << *item;
item = item->GetNext();
}
return os;
}
void TStack::push(Triangle &&triangle) {
TStackItem *other = new TStackItem(triangle);
other->SetNext(head);
head = other;
}
bool TStack::empty() {
return head == nullptr;
}
Triangle TStack::pop() {
Triangle result;
if (head!= nullptr) {
TStackItem *old_head = head;
head = head->GetNext();
result = old_head->GetTriangle();
old_head->SetNext(nullptr);
delete old_head;
}
return result;
}
TStack::~TStack() {
delete head;
}
Листинг Файла TStackItem. h
#ifndef TSTACKITEM_H
#define TSTACKITEM_H
#include "Triangle. h"
class TStackItem {
public:
TStackItem(const Triangle& triangle);
TStackItem(const TStackItem& orig);
friend std::ostream& operator<<(std::ostream& os, const TStackItem& obj);
TStackItem* SetNext(TStackItem* next);
TStackItem* GetNext();
Triangle GetTriangle() const;
virtual ~TStackItem();
private:
Triangle triangle;
TStackItem *next;
};
#endif /* TSTACKITEM_H */
Листинг Файла TStackItem. cpp
#include "TStackItem. h"
#include <iostream>
TStackItem::TStackItem(const Triangle& triangle) {
this->triangle = triangle;
this->next = nullptr;
std::cout << "Stack item: created" << std::endl;
}
TStackItem::TStackItem(const TStackItem& orig) {
this->triangle = orig. triangle;
this->next = orig. next;
std::cout << "Stack item: copied" << std::endl;
}
TStackItem* TStackItem::SetNext(TStackItem* next) {
TStackItem* old = this->next;
this->next = next;
return old;
}
Triangle TStackItem::GetTriangle() const {
return this->triangle;
}
TStackItem* TStackItem::GetNext() {
return this->next;
}
TStackItem::~TStackItem() {
std::cout << "Stack item: deleted" << std::endl;
delete next;
}
std::ostream& operator<<(std::ostream& os, const TStackItem& obj) {
os << "[" << obj. triangle << "]" << std::endl;
return os;
}
Листинг Файла Triangle. h
#ifndef TRIANGLE_H
#define TRIANGLE_H
#include <cstdlib>
#include <iostream>
class Triangle {
public:
Triangle();
Triangle(size_t i, size_t j, size_t k);
Triangle(const Triangle& orig);
Triangle& operator++();
double Square();
friend Triangle operator+(const Triangle& left, const Triangle& right);
friend std::ostream& operator<<(std::ostream& os, const Triangle& obj);
friend std::istream& operator>>(std::istream& is, Triangle& obj);
Triangle& operator=(const Triangle& right);