Gistrec

ООП ЛАБ2_v3 Container

Nov 15th, 2017
280
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.65 KB | None | 0 0
  1. //
  2. //  Container.h
  3. //
  4.  
  5. #pragma once
  6. #include "OwnIterator.h"
  7. #include "MyCircle.h"
  8. #include <memory>
  9. #include <fstream>
  10. #include <iostream>
  11.  
  12. //  Класс реализует понятие таблицы для хранения классов
  13. //  Позволяет добавлять, удалять и искать классы по их id
  14. //
  15. //  У каждого класса должен быть уникальный id
  16. class Container {
  17.  
  18. private:
  19.     //  Структура элемента списка
  20.     struct Element {
  21.         int id;
  22.         std::shared_ptr<MyCircle> figure;
  23.         std::shared_ptr<Element> previous;
  24.         std::shared_ptr<Element> next;
  25.     };
  26.  
  27.     // Для итератора
  28.     using iterator = OwnIterator<MyCircle, Element>;
  29.     using const_iterator = OwnIterator<const MyCircle, Element>;
  30.  
  31.     // Двунаправленный список указатель на начало и конец
  32.     std::shared_ptr<Element> start;
  33.     std::shared_ptr<Element> tail;
  34.  
  35.     //  Получаем указатель на первый или последний элемент
  36.     std::shared_ptr<Element> getFirstElement() const;
  37.     std::shared_ptr<Element> getLastElement() const;
  38.  
  39. public:
  40.     // Конструктор класса
  41.     Container();
  42.  
  43.     // Для итератора
  44.     iterator begin();
  45.     iterator end();
  46.  
  47.     const_iterator begin() const;
  48.     const_iterator end() const;
  49.  
  50.     //  Добавить фигуру с заданным id вначало списка
  51.     void addFigure(std::shared_ptr<MyCircle> figure, int id);
  52.  
  53.     //  Получаем указатель на класс фигуры
  54.     //  Если фигуры с таким id нет - возвращает NULL
  55.     std::shared_ptr<MyCircle> getFigure(int id) const;
  56.  
  57.     //  Проверяем находится ли фигура c заданным id в контейнере
  58.     bool isInContainer(int id) const;
  59.  
  60.     //  Удалить фигуру с заданным id
  61.     void deleteFigure(int id);
  62.  
  63.     //  Выводим id всех фигур
  64.     void printAllId() const;
  65.  
  66.     //  Загрузка набора фигур в контейнер
  67.     void load(const std::string &fileName);
  68.  
  69.     //  Сохраняем набор фигур в файл
  70.     void save(const std::string &fileName) const;
  71.  
  72.     //  Деструктор нужен для освобождения памяти
  73.     ~Container();
  74. };
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82. //
  83. //  Container.h
  84. //
  85. #pragma once
  86. #include "Сontainer.h"
  87.  
  88. Container::Container() {
  89.     start = nullptr;
  90.     tail = nullptr;
  91. }
  92.  
  93. Container::iterator Container::begin() {
  94.     return iterator(start);
  95. }
  96.  
  97. Container::iterator Container::end() {
  98.     return iterator(nullptr);
  99. }
  100.  
  101. Container::const_iterator Container::begin() const {
  102.     return const_iterator(start);
  103. }
  104.  
  105. Container::const_iterator Container::end() const {
  106.     return const_iterator(nullptr);
  107. }
  108.  
  109. std::shared_ptr<Element> Container::getFirstElement() const {
  110.     return start;
  111. }
  112.  
  113. std::shared_ptr<Element> Container::getLastElement() const {
  114.     return tail;
  115. }
  116.  
  117. std::shared_ptr<MyCircle> Container::getFigure(int id) const {
  118.     std::shared_ptr<Element> currentElement = getFirstElement();
  119.     while (currentElement != nullptr) {
  120.         if (currentElement->id == id) return currentElement->figure;
  121.         currentElement = currentElement->next;
  122.     }
  123.     if (currentElement == nullptr) return NULL;
  124.     else return currentElement->figure;
  125. }
  126.  
  127. bool Container::isInContainer(int id) const {
  128.     if (getFigure(id) == nullptr) return false;
  129.     else return true;
  130. }
  131.  
  132. // Добавляем новый элемент в начало списка
  133. void Container::addFigure(std::shared_ptr<MyCircle> figure, int id) {
  134.     //Element* newElement = new Element();
  135.     std::shared_ptr<Element> newElement = std::make_shared<Element>();
  136.     newElement->id = id;
  137.     newElement->figure = figure;
  138.     newElement->next = getFirstElement();
  139.     newElement->previous = nullptr;
  140.     if (getFirstElement() != nullptr) {
  141.         getFirstElement()->previous = newElement;
  142.     }
  143.     start = newElement;
  144. }
  145.  
  146. void Container::deleteFigure(int id) {
  147.     std::shared_ptr<Element> currentElement = getFirstElement();
  148.     while (currentElement != nullptr && currentElement->id != id) {
  149.         currentElement = currentElement->next;
  150.     }
  151.     if (currentElement == nullptr) return;
  152.     *(currentElement->previous->next) = *(currentElement->next);
  153.     *(currentElement->next->previous) = *(currentElement->previous);
  154. }
  155.  
  156. void Container::printAllId() const {
  157.     std::shared_ptr<Element> currentElement = getFirstElement();
  158.     while (currentElement != nullptr) {
  159.         std::cout << currentElement->id << " ";
  160.         currentElement = currentElement->next;
  161.     }
  162. }
  163.  
  164. void Container::load(const std::string &fileName) {
  165.     // Данные для фигуры
  166.     int id = 0;
  167.     int centerX, centerY, radius;
  168.  
  169.     std::ifstream input(fileName);
  170.     if (!input.is_open()) throw 3;
  171.     while (input >> centerX >> centerY >> radius) {
  172.         std::cout << centerX << " " << centerY << " " << radius << "\n";
  173.         std::shared_ptr<MyCircle> newFigure = std::make_shared<MyCircle>(centerX, centerY, radius);
  174.         addFigure(newFigure, id++);
  175.     }
  176. }
  177.  
  178. void Container::save(const std::string &fileName) const {
  179.     std::ofstream output(fileName);
  180.    
  181.     std::shared_ptr<Element> currentElement = getFirstElement();
  182.     while (currentElement != nullptr) {
  183.         std::shared_ptr<MyCircle> figure = currentElement->figure;
  184.         output << figure->getCenterX() << figure->getCenterY() << figure->getRadius() << "\n";
  185.         currentElement = currentElement->next;
  186.     }
  187. }
  188.  
  189. Container::~Container() {
  190.     std::shared_ptr<Element> currentElement = getFirstElement();
  191.     while (currentElement != nullptr) {
  192.         std::shared_ptr<Element> deleteElement = currentElement;
  193.         currentElement = currentElement->next;
  194.         deleteElement->next = nullptr;
  195.         deleteElement->previous = nullptr;
  196.     }
  197. }
Advertisement
Comments
  • User was banned
Add Comment
Please, Sign In to add comment