Построение шаблонов динамических структур данных
std::cout << "Triangle deleted" << std::endl;
}
std::ostream& operator<<(std::ostream& os, const Triangle& obj) {
os << "a=" << obj. side_a << ", b=" << obj. side_b << ", c=" << obj. side_c;
return os;
}
Листинг файла main. cpp
#include <cstdlib>
#include <iostream>
#include <memory>
#include "Triangle. h"
#include "TStackItem. h"
#include "TStack. h"
int main(int argc, char** argv) {
TStack stack;
stack. push(std::shared_ptr<Triangle>(new Triangle(1,1,1)));
stack. push(std::shared_ptr<Triangle>(new Triangle(2,2,2)));
stack. push(std::shared_ptr<Triangle>(new Triangle(3,3,3)));
std::cout << stack;
std::shared_ptr<Triangle> t;
t = stack. pop(); std::cout << *t << std::endl;
t = stack. pop(); std::cout << *t << std::endl;
t = stack. pop(); std::cout << *t << std::endl;
return 0;
}
Лабораторная работа №4
Цель работы
Целью лабораторной работы является:
· Знакомство с шаблонами классов.
· Построение шаблонов динамических структур данных.
Задание
Необходимо спроектировать и запрограммировать на языке C++ шаблон класса-контейнера первого уровня, содержащий все три фигуры класса фигуры, согласно вариантов задания (реализованную в ЛР1).
Классы должны удовлетворять следующим правилам:
· Требования к классам фигуры аналогичны требованиям из лабораторной работы 1.
· Шаблон класса-контейнера должен соджержать объекты используя std:shared_ptr<…>.
· Шаблон класса-контейнера должен иметь метод по добавлению фигуры в контейнер.
· Шаблон класса-контейнера должен иметь методы по получению фигуры из контейнера (опеределяется структурой контейнера).
· Шаблон класса-контейнера должен иметь метод по удалению фигуры из контейнера (опеределяется структурой контейнера).
· Шаблон класса-контейнера должен иметь перегруженный оператор по выводу контейнера в поток std::ostream (<<).
· Шаблон класса-контейнера должен иметь деструктор, удаляющий все элементы контейнера.
· Классы должны быть расположенны в раздельных файлах: отдельно заголовки (.h), отдельно описание методов (.cpp).
Нельзя использовать:
· Стандартные контейнеры std.
Программа должна позволять:
· Вводить произвольное количество фигур и добавлять их в контейнер.
· Распечатывать содержимое контейнера.
· Удалять фигуры из контейнера.
Полезный пример
Данный пример демонстрирует основные возможности языка C++, которые понадобится применить в данной лабораторной работе. Пример не является решением варианта лабораторной работы.
Листинг файла TStack. h
ifndef TSTACK_H
#define TSTACK_H
#include "Triangle. h"
#include "TStackItem. h"
#include <memory>
template <class T> class TStack {
public:
TStack();
void push(std::shared_ptr<T> &&item);
bool empty();
std::shared_ptr<T> pop();
template <class A> friend std::ostream& operator<<(std::ostream& os, const TStack<A>& stack);
virtual ~TStack();
private:
std::shared_ptr<TStackItem<T>> head;
};
#endif /* TSTACK_H */
Листинг файла TStack. СPP
#include "TStack. h"
template <class T> TStack<T>::TStack() : head(nullptr) {
}
template <class T> std::ostream& operator<<(std::ostream& os, const TStack<T>& stack) {
std::shared_ptr<TStackItem<T>> item = stack. head;
while(item!=nullptr)
{
os << *item;
item = item->GetNext();
}
return os;
}
template <class T> void TStack<T>::push(std::shared_ptr<T> &&item) {
std::shared_ptr<TStackItem<T>> other(new TStackItem<T>(item));
other->SetNext(head);
head = other;
}
template <class T> bool TStack<T>::empty() {
return head == nullptr;
}
template <class T> std::shared_ptr<T> TStack<T>::pop() {
std::shared_ptr<T> result;
if (head!= nullptr) {
result = head->GetTriangle();
head = head->GetNext();
}
return result;
}
template <class T> TStack<T>::~TStack() {
}
#include "Triangle. h"
template class TStack<Triangle>;
template std::ostream& operator<<(std::ostream& os, const TStack<Triangle>& stack);
Листинг файла TStackItem. h
#ifndef TSTACKITEM_H
#define TSTACKITEM_H
#include <memory>
template<class T> class TStackItem {
public:
TStackItem(const std::shared_ptr<T>& triangle);
template<class A> friend std::ostream& operator<<(std::ostream& os, const TStackItem<A>& obj);
std::shared_ptr<TStackItem<T>> SetNext(std::shared_ptr<TStackItem> &next);
std::shared_ptr<TStackItem<T>> GetNext();
std::shared_ptr<T> GetTriangle() const;
virtual ~TStackItem();
private:
std::shared_ptr<T> item;
std::shared_ptr<TStackItem<T>> next;
};
#endif /* TSTACKITEM_H */
Листинг файла TStackItem. CPP
#include "TStackItem. h"
#include <iostream>
template <class T> TStackItem<T>::TStackItem(const std::shared_ptr<T>& item) {
this->item = item;
this->next = nullptr;
std::cout << "Stack item: created" << std::endl;
}
template <class T> std::shared_ptr<TStackItem<T>> TStackItem<T>::SetNext(std::shared_ptr<TStackItem<T>> &next) {
std::shared_ptr<TStackItem<T>> old = this->next;
this->next = next;
return old;
}
template <class T> std::shared_ptr<T> TStackItem<T>::GetTriangle() const {
return this->item;
}
template <class T> std::shared_ptr<TStackItem<T>> TStackItem<T>::GetNext() {
return this->next;
}
template <class T> TStackItem<T>::~TStackItem() {
std::cout << "Stack item: deleted" << std::endl;
}
template <class A> std::ostream& operator<<(std::ostream& os, const TStackItem<A>& obj) {
os << "[" << *obj. item << "]" << std::endl;
return os;
}
#include "Triangle. h"
template class TStackItem<Triangle>;
template std::ostream& operator<<(std::ostream& os, const TStackItem<Triangle>& obj);
Листинг файла 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);
friend std::ostream& operator<<(std::ostream& os, const Triangle& obj);
Triangle& operator=(const Triangle& right);
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>
Triangle::Triangle() : Triangle(0, 0, 0) {
std::cout << "Triangle created: default" << std::endl;
}
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(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;
}
Triangle& Triangle::operator=(const Triangle& right) {
if (this == &right) return *this;
std::cout << "Triangle copied" << std::endl;
side_a = right. side_a;
side_b = right. side_b;
side_c = right. side_c;
return *this;
}
Triangle::~Triangle() {
std::cout << "Triangle deleted" << std::endl;
}
std::ostream& operator<<(std::ostream& os, const Triangle& obj) {
os << "a=" << obj. side_a << ", b=" << obj. side_b << ", c=" << obj. side_c;
return os;
}
Листинг файла main. cpp
#include <cstdlib>
#include <iostream>
#include <memory>
#include "Triangle. h"
#include "TStackItem. h"
#include "TStack. h"
// template stack on shared_ptr
int main(int argc, char** argv) {
TStack<Triangle> stack;
stack. push(std::shared_ptr<Triangle>(new Triangle(1,1,1)));
stack. push(std::shared_ptr<Triangle>(new Triangle(2,2,2)));