Не могу присвоить значение элементу массива указателей
По заданию надо сделать класс 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;
}