Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Container.h
- //
- #pragma once
- #include "OwnIterator.h"
- #include "MyCircle.h"
- #include <memory>
- #include <fstream>
- #include <iostream>
- // Класс реализует понятие таблицы для хранения классов
- // Позволяет добавлять, удалять и искать классы по их id
- //
- // У каждого класса должен быть уникальный id
- class Container {
- private:
- // Структура элемента списка
- struct Element {
- int id;
- std::shared_ptr<MyCircle> figure;
- std::shared_ptr<Element> previous;
- std::shared_ptr<Element> next;
- };
- // Для итератора
- using iterator = OwnIterator<MyCircle, Element>;
- using const_iterator = OwnIterator<const MyCircle, Element>;
- // Двунаправленный список указатель на начало и конец
- std::shared_ptr<Element> start;
- std::shared_ptr<Element> tail;
- // Получаем указатель на первый или последний элемент
- std::shared_ptr<Element> getFirstElement() const;
- std::shared_ptr<Element> getLastElement() const;
- public:
- // Конструктор класса
- Container();
- // Для итератора
- iterator begin();
- iterator end();
- const_iterator begin() const;
- const_iterator end() const;
- // Добавить фигуру с заданным id вначало списка
- void addFigure(std::shared_ptr<MyCircle> figure, int id);
- // Получаем указатель на класс фигуры
- // Если фигуры с таким id нет - возвращает NULL
- std::shared_ptr<MyCircle> getFigure(int id) const;
- // Проверяем находится ли фигура c заданным id в контейнере
- bool isInContainer(int id) const;
- // Удалить фигуру с заданным id
- void deleteFigure(int id);
- // Выводим id всех фигур
- void printAllId() const;
- // Загрузка набора фигур в контейнер
- void load(const std::string &fileName);
- // Сохраняем набор фигур в файл
- void save(const std::string &fileName) const;
- // Деструктор нужен для освобождения памяти
- ~Container();
- };
- //
- // Container.h
- //
- #pragma once
- #include "Сontainer.h"
- Container::Container() {
- start = nullptr;
- tail = nullptr;
- }
- Container::iterator Container::begin() {
- return iterator(start);
- }
- Container::iterator Container::end() {
- return iterator(nullptr);
- }
- Container::const_iterator Container::begin() const {
- return const_iterator(start);
- }
- Container::const_iterator Container::end() const {
- return const_iterator(nullptr);
- }
- std::shared_ptr<Element> Container::getFirstElement() const {
- return start;
- }
- std::shared_ptr<Element> Container::getLastElement() const {
- return tail;
- }
- std::shared_ptr<MyCircle> Container::getFigure(int id) const {
- std::shared_ptr<Element> currentElement = getFirstElement();
- while (currentElement != nullptr) {
- if (currentElement->id == id) return currentElement->figure;
- currentElement = currentElement->next;
- }
- if (currentElement == nullptr) return NULL;
- else return currentElement->figure;
- }
- bool Container::isInContainer(int id) const {
- if (getFigure(id) == nullptr) return false;
- else return true;
- }
- // Добавляем новый элемент в начало списка
- void Container::addFigure(std::shared_ptr<MyCircle> figure, int id) {
- //Element* newElement = new Element();
- std::shared_ptr<Element> newElement = std::make_shared<Element>();
- newElement->id = id;
- newElement->figure = figure;
- newElement->next = getFirstElement();
- newElement->previous = nullptr;
- if (getFirstElement() != nullptr) {
- getFirstElement()->previous = newElement;
- }
- start = newElement;
- }
- void Container::deleteFigure(int id) {
- std::shared_ptr<Element> currentElement = getFirstElement();
- while (currentElement != nullptr && currentElement->id != id) {
- currentElement = currentElement->next;
- }
- if (currentElement == nullptr) return;
- *(currentElement->previous->next) = *(currentElement->next);
- *(currentElement->next->previous) = *(currentElement->previous);
- }
- void Container::printAllId() const {
- std::shared_ptr<Element> currentElement = getFirstElement();
- while (currentElement != nullptr) {
- std::cout << currentElement->id << " ";
- currentElement = currentElement->next;
- }
- }
- void Container::load(const std::string &fileName) {
- // Данные для фигуры
- int id = 0;
- int centerX, centerY, radius;
- std::ifstream input(fileName);
- if (!input.is_open()) throw 3;
- while (input >> centerX >> centerY >> radius) {
- std::cout << centerX << " " << centerY << " " << radius << "\n";
- std::shared_ptr<MyCircle> newFigure = std::make_shared<MyCircle>(centerX, centerY, radius);
- addFigure(newFigure, id++);
- }
- }
- void Container::save(const std::string &fileName) const {
- std::ofstream output(fileName);
- std::shared_ptr<Element> currentElement = getFirstElement();
- while (currentElement != nullptr) {
- std::shared_ptr<MyCircle> figure = currentElement->figure;
- output << figure->getCenterX() << figure->getCenterY() << figure->getRadius() << "\n";
- currentElement = currentElement->next;
- }
- }
- Container::~Container() {
- std::shared_ptr<Element> currentElement = getFirstElement();
- while (currentElement != nullptr) {
- std::shared_ptr<Element> deleteElement = currentElement;
- currentElement = currentElement->next;
- deleteElement->next = nullptr;
- deleteElement->previous = nullptr;
- }
- }
Advertisement