Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2022, 21:16   #1
nonameii3ii
Пользователь
 
Регистрация: 16.04.2021
Сообщений: 73
По умолчанию Использование умных указателей для обработки данных иерархии классов IShape

Здравствуйте,ув.программисты,есть вот такое задание:Разработайте классы следующей иерархии геометрических фигур:
1) IShape (базовый интерфейс геометрических фигур)
Функции:
Площадь фигуры (чисто виртуальный метод)
Периметр фигуры (чисто виртуальный метод)
Строковое представление фигуры (чисто виртуальный метод)

Производные классы:
2) CRectangle (прямоугольник)
Свойства: точка, задающая координаты верхнего левого угла прямоугольника, ширина, высота

3) CTriangle (треугольник)
Свойства: координаты трех точек в вершинах треугольника.
Отрезки, задающие три стороны треугольника

4) CSquare (квадрат)
Свойство: сторона квадрата.

В базовом интерфейсе IShape должен быть метод std::string ToString() const, возвращающий строковое представление фигуры.
Программа считывает в std::vector информацию о фигурах из стандартного потока ввода. После считывания фигур необходимо вывести их в стандартный поток вывода. При выводе фигур в стандартный поток вывода должны также выводиться площадь фигуры и периметр.
Поместить в std::vector объекты разных типов не получится, однако вместо хранения самих объектов в нем следует хранить указатели на IShape. Вместо хранения сырых указателей в массиве использовать умные указатели std::shared_ptr<IShape> или std::unique_ptr<IShape>.
Вот то что сделал я,как действовать дальше понятия не имею,заранее спасибо за помощь вот код:
Код:
#include <iostream>
 
#include <cmath>
 
using namespace std;
 
class IShape
{
public:
    virtual double square() = 0;
    virtual double perimeter() = 0;
    virtual string representationShape() const = 0;
    string ToString() const
    {
        return representationShape();
    }
    virtual ~IShape();
};
 
class Triangle : public IShape { //Класс-потомок (треугольник)
 
private:
 
    double a, b, c;
 
public:
 
    //Реализуем виртуальные методы базового (абстрактного) класса
 
    void calc_square() const { //Функция вычисления площади фигуры (треугольника)           
        double p = a + b + c;
        cout << sqrt(p * (p - a) * (p - b) * (p - c));
    }
 
    void calc_perimeter() const { //Функция вычисления периметра фигуры (треугольника)            
        cout << a + b + c;
    }
 
    //Конструктор с параметром (инициализирующий конструктор)
 
    Triangle(double side_a, double side_b, double side_c)
        : a(side_a), b(side_b), c(side_c) {}
};
 
 
 
class Rectangle : public IShape { //Класс-потомок (прямоугольник)
 
private:
 
    double a, b;
 
public:
 
    //Реализуем виртуальные методы базового (абстрактного) класса
 
    void calc_square() const { //Функция вычисления площади фигуры (прямоугольника)           
        cout << a * b;
    }
 
    void calc_perimeter() const { //Функция вычисления периметра фигуры (прямоугольника)            
        cout << 2 * (a + b);
    }
 
    //Конструктор с параметром (инициализирующий конструктор)
 
    Rectangle(double side_a, double side_b)
        : a(side_a), b(side_b) {}
};
 
class Square : public IShape { //Класс-потомок (квадрат)
 
private:
 
    double a;
 
public:
 
    //Реализуем виртуальные методы базового (абстрактного) класса
 
    void calc_square() const { //Функция вычисления площади фигуры (квадрата)           
        cout << a * a;
    }
 
    void calc_perimeter() const { //Функция вычисления периметра фигуры (квадрата)            
        cout << 4 * a;
    }
 
    //Конструктор с параметром (инициализирующий конструктор)
 
    Square(double side_a)
        : a(side_a) {}
};
 
int main() {
    IShape** ishape = new IShape*[5];
    cout << "Output of the program:\n";
    cout << "\nFigure #1 (triangle):";
    ishape[0] = new Triangle(3, 4, 5); //Создаем треугольник со сторонами 3, 4, 5
    cout << "\nSquare: ";
    ishape[0]->calc_square(); //Вычисляем площадь треугольника
    cout << "\nPerimeter: ";
    ishape[0]->calc_perimeter(); //Вычисляем периметр треугольника
 
    
 
    cout << "\n\nFigure #1 (rectangle):";
    ishape[1] = new Rectangle(4, 5); //Создаем прямоугольник со сторонами 4 и 5
    cout << "\nSquare: ";
    ishape[1]->calc_square(); //Вычисляем площадь прямоугольника
    cout << "\nPerimeter: ";
    ishape[1]->calc_perimeter(); //Вычисляем периметр прямоугольника
 
    cout << "\n\nFigure #2 (square):";
    ishape[2] = new Square(5); //Создаем квадрат со стороной 5
    cout << "\nSquare: ";
    ishape[2]->calc_square(); //Вычисляем площадь квадрата
    cout << "\nPerimeter: ";
    ishape[2]->calc_perimeter(); //Вычисляем периметр квадрата
    delete ishape[0];
    
    delete ishape[1];
    delete ishape[2];
    delete[] ishape;
    return 0;
}
nonameii3ii вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приведение умных указателей базового типа к дочернему ACE Valery Общие вопросы C/C++ 2 17.08.2017 22:24
Реализация умных указателей FIDE Общие вопросы C/C++ 26 11.03.2015 21:17
Использование циклов для обработки данных в таблице MrRick Microsoft Office Excel 15 16.12.2012 23:28
использование циклов для обработки данных -Светка- Microsoft Office Excel 2 06.12.2012 00:04
Создание собственной иерархии классов >>JJ<< Помощь студентам 1 06.07.2011 14:24