Не могу присвоить значение элементу массива указателей

По заданию надо сделать класс Image содержащий массив указателей на объекты. Я не понимаю почему выдает ошибку при выделении памяти.

Ошибка при наведении на p[i]: (локальная переменная) Image р Поиск в Интернете выражение должно быть допустимым для изменения левосторонним значением

Ошибку указал в коде файла main.cpp (строки 56, 58)

Inheritance.h

#ifndef INHERITANCE_H
#define INHERITANCE_H

#include <iostream>
#include <string>

using namespace std;

class Figure 
{
public:
    //virtual ~Figure() = 0;
    virtual double area() = 0;
    virtual double centerOfGravity() = 0;
    virtual double perimeter() = 0;
    virtual string myName() = 0;
    virtual void inputFigure(istream& stream) = 0;
    virtual void outputFigure(ostream& stream) = 0;
    friend istream& operator>>(istream& stream, Figure& figure);
    friend ostream& operator<<(ostream& stream, Figure& figure);

};


class Rectangle_ : public Figure
{
    double xL;
    double yL;
    double xR;
    double yR;
public:
    Rectangle_();
    ~Rectangle_();
    Rectangle_(Rectangle_& other);
    double area();
    double centerOfGravity();
    double perimeter();
    string myName();
    void inputFigure(istream& stream);
    void outputFigure(ostream& stream);
};

class Circle_ : public Figure
{
    double xCenter;
    double yCenter;
    double radius;
public:
    Circle_();
    ~Circle_();
    Circle_(Circle_& other);
    double area();
    double centerOfGravity();
    double perimeter();
    string myName();
    void inputFigure(istream& stream);
    void outputFigure(ostream& stream);
};

class Image
{
    Figure** data;
public:
    Image(int len);
    Figure* operator[](int i);
};
#endif

inheritance.cpp

#include "Inheritance.h"
#include <iostream>

using namespace std;

Rectangle_::Rectangle_()
{
    xL = 0;
    yL = 0;
    xR = 1;
    yR = 1;
}

Rectangle_::~Rectangle_()
{
}

Rectangle_::Rectangle_(Rectangle_& other) :
    xL(other.xL),
    yL(other.yL),
    xR(other.xR),
    yR(other.yR)
{}

double Rectangle_::area ()
{
    double height = yR - yL;
    double width = xR - xL;

    return height * width;
}

double Rectangle_::centerOfGravity()
{
    double height = yR - yL;

    return height / 2;

}

double Rectangle_::perimeter()
{
    double height = yR - yL;
    double width = xR - xL;

    return height * 2 + width * 2;
}

string Rectangle_::myName()
{
    return "Прямоугольник";
}

void Rectangle_::inputFigure(istream& stream)
{
    if (&stream == &cin) {
        cout << "Введите координаты прямоугольника" << endl;
        cout << "Левый нижний угол: " << endl;
        cout << "x: ";
        stream >> xL;
        cout << "y: ";
        stream >> yL;
        cout << "\nПравый верхний угол" << endl;
        cout << "x: ";
        stream >> xR;
        cout << "\ny: ";
        stream >> yR;
        cout << endl;
    } 
    else {
        stream >> xL;
        stream >> yL;
        stream >> xR;
        stream >> yR;
    }
}

void Rectangle_::outputFigure(ostream& stream)
{
    stream << "Фигура: " << this->myName() << endl;
    stream << "Координаты левого нижнего и правого верхнего углов соответственно: ";
    stream << "(" << xL << "," << yL << ")" << "; " << "(" << xR << "," << yR << ")" << endl;
    stream << "Площадь: " << this->area() << endl;
    stream << "Центр тяжести: " << this->centerOfGravity() << endl;
    stream << "Периметр: " << this->perimeter() << endl << endl;

}

Circle_::Circle_()
{
    xCenter = 1;
    yCenter = 1;
    radius = 1;
}

Circle_::~Circle_()
{
}

Circle_::Circle_(Circle_& other) :
    xCenter(other.xCenter),
    yCenter(other.yCenter),
    radius(other.radius)
{}

double Circle_::area()
{
    return 3.14 * radius * radius;
}

double Circle_::centerOfGravity()
{

    return radius;
}

double Circle_::perimeter()
{
    return 2 * 3.14 * radius;
}

string Circle_::myName()
{
    return "Круг";
}

void Circle_::inputFigure(istream& stream)
{
    if (&stream == &cin) {
        cout << "Введите координаты центра круга" << endl;
        cout << "x: ";
        stream >> xCenter;
        cout << "y: ";
        stream >> yCenter;
        cout << "\nВведите радиус" << endl;
        cout << "Радиус: ";
        stream >> radius;
        cout << endl;
    }
    else {
        stream >> xCenter;
        stream >> yCenter;
        stream >> radius;
    }
}

void Circle_::outputFigure(ostream& stream)
{
    stream << "Фигура: " << this->myName() << endl;
    stream << "Координаты центра и радиус соответственно: ";
    stream << "(" << xCenter << "," << yCenter << ")" << "; " << radius << endl;
    stream << "Площадь: " << this->area() << endl;
    stream << "Центр тяжести: " << this->centerOfGravity() << endl;
    stream << "Периметр: " << this->perimeter() << endl << endl;
}

Image::Image(int len)
{
    data = new Figure * [len];
}

Figure* Image::operator[](int i)
{
    return data[i];
}

istream& operator>>(istream& stream, Figure& figure)
{
    figure.inputFigure(stream);
    return stream;
}

ostream& operator<<(ostream& stream, Figure& figure)
{
    figure.outputFigure(stream);
    return stream;
}

main.cpp

#include "Inheritance.h"
#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

//Вариант №7.
//Создать  абстрактный  класс Figure(Фигура) с  чистыми  виртуальными  методами вычисления площади, центра тяжести и периметра.
//На его основе реализовать классы : 
//-Rectangle(Прямоугольник)с  полями  для  указания  координат  верхнего  левого  и нижнего правого углов; 
//-Circle(Круг) с полями для координат центра и радиуса.
//Для массива указателей на объекты этих классов предусмотреть возможность : 
//-вывода характеристик объектов списка; 
//-вывода объектов, у которых периметр находится в заданном диапазоне; 
//-отображения на экране объекта с максимальной площадью.
//Создать класс Image, содержащий массив указателей на объекты этих классов.
//Написать демонстрационную программу, в которой будут использоваться все методы классов.



int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    bool play = true;
    int action;
    int n;
    while (play)
    {
        cout << "1. Заполнение массива объектами " << endl;
        cout << "0. Завершить работу программы" << endl << endl;
        cout << "Введите цифру действия: ";
        cin >> action;
        cout << endl;
        switch (action)
        {
        case 1:
        {
            int n;
            cout << "Введите количество элементов: ";
            cin >> n;
            cout << endl;
            Image p(n);
            int type;
            int filter;
            bool filterPlay = true;
            cout << "Заполнение объектов: " << endl;
            for (int i = 0; i < n; i++) {
                cout << "1. Прямоугольник" << endl;
                cout << "2. Круг" << endl;
                cout << "Введите цифру фигуры: ";
                cin >> type;
                cout << endl;
                if (type == 1)
                    p[i] = new Rectangle_(); //заполнение полей //ОШИБКА ЗДЕСЬ
                else if (type == 2)
                    p[i] = new Circle_(); //заполнение полей //И ЗДЕСЬ ОШИБКА
            }
            cout << "\nЗаполнение данных: " << endl;
            for (int i = 0; i < n; i++) {
                //p[i]->inputFigure(cin);
                cin >> *p[i];
            }
            while (filterPlay) {
                cout << "1. Вывод объектов на экран" << endl;
                cout << "2. Вывод объектов, у которых периметр находится в заданном диапазоне" << endl;
                cout << "3. Вывод объекта с максимальной площадью" << endl;
                cout << "0. Выйти" << endl;
                cout << "Введите цифру действия: ";
                cin >> filter;
                cout << endl;
                cout << endl;
                switch (filter)
                {
                case 1:
                {
                    cout << "\n//////Вывод характеристик объектов: " << endl;
                    for (int i = 0; i < n; i++) {
                        //p[i]->outputFigure(cout);
                        cout << *p[i];
                    }
                    break;
                }
                case 2:
                {
                    double min;
                    double max;
                    cout << "Введите диапазон периметра" << endl;
                    cout << "Минимум: ";
                    cin >> min;
                    cout << "Максимум: ";
                    cin >> max;
                    cout << endl;
                    cout << "//////Вывод:" << endl;
                    for (int i = 0; i < n; i++) {
                        if (min <= p[i]->perimeter() && p[i]->perimeter() <= max)
                            //p[i]->outputFigure(cout);
                            cout << *p[i];
                    }
                    break;
                }
                case 3:
                {
                    Figure* maxim = p[0];
                    double perimeter = 0;
                    cout << "//////Максимальная площадь:" << endl;
                    for (int i = 0; i < n; i++)
                    {
                        if (p[i]->perimeter() > perimeter)
                        {
                            perimeter = p[i]->perimeter();
                            maxim = p[i];
                        }
                    }
                    //maxim->outputFigure(cout);
                    cout << *maxim;
                    break;
                }
                case 0:
                    filterPlay = !filterPlay;
                default:
                    break;
                }
            }
            
            break;
        }
        case 0:
        {
            play = !play;
        }
        default:
            break;
        }
    }
    return 0;
}

Ответы (0 шт):