C2102 - для & требуется левостороннее значение

Немного дополненный код из книги. Не знаю, почему выдаёт ошибку и, что самое удивительное, выдаёт ошибку не в мной написанном коде!

#include <iostream>
using namespace std;

char* mycpy(char* word_1, const char* word_2) {
    while (*word_1++ = *word_2++);
    return word_1;
}

class TwoDShape {
    double width, height;
    char name[20];
public:
    TwoDShape() {
        width = height = 0, 0;
        mycpy(name, "no");
    }
    TwoDShape(double w, double h, const char* n) {
        width = w;
        height = h;
        mycpy(name, n);
    }
    TwoDShape(double x, const char* n) {
        width = height = x;
        mycpy(name, n);
    }

    void showDim() {
        cout << "Ширина и высота составляют " << width << "и " << height << "\n";
    }

    double getWidth() { return width; }
    double getHeight() { return height; }
    void setWigth(double w) { width = w; }
    void setHeight(double h) { height = h; }
    void setName(const char* n) { mycpy(name, n); }
    char* getName() { return name; }

    virtual double area() = 0;
};

class Triangle : public TwoDShape {
    char style[20];
public:
    Triangle() {
        mycpy(style, "no");
    }
    Triangle(const char* str, double w, double h) : TwoDShape(w, h, "треугольник") {
        mycpy(style, str);
    }
    Triangle(double x) : TwoDShape(x, "треугольник") {
        mycpy(style, "равнобедренный");
    }

    void showStyle() {
        cout << "Треугольник " << style << "\n";
    }
    double area() {
        return getWidth() * getHeight() / 2;
    }
};

class Rectangle : public TwoDShape {
public:
    Rectangle(double w, double h) : TwoDShape(w, h, "Прямоугольник"){ }
    Rectangle(double x) : TwoDShape(x, "Прямоугольник") { }

    bool isSquare() {
        if (getWidth() == getHeight()) return true;
        return false;
    }
    double area() {
        return getWidth() * getHeight();
    }
};

class Circle : public TwoDShape {
    double R;
public:
    Circle(double r) : TwoDShape() { 
        R = r;
        setName("Кргу");
    }

    double area() {
        return (3.14 * (R * R));
    }
};

int main() {
    setlocale(LC_ALL, "ru");
    TwoDShape* p_shapes[5];

    p_shapes[0] = &Triangle("Прямоугольный", 8.0, 12.0); // <------------ Ошибка
    p_shapes[1] = &Rectangle(10);// <------------ Ошибка
    p_shapes[2] = &Rectangle(10, 4);// <------------ Ошибка
    p_shapes[3] = &Triangle(7.0);// <------------ Ошибка
    p_shapes[4] = &Circle(33.0);// <------------ Ошибка

    for (int i = 0; i < 4; i++) {
        cout << "Объект представляет собой " << p_shapes[i]->getName() << "\n";
        cout << "Площадь равна " << p_shapes[i]->area() << "\n";
        cout << "\n";
    }
}

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

Автор решения: Harry

Ваши ошибки связаны с тем, что вы создаете r-value, т.е. сугубо временный объект, который можно присвоить, но которому ничего присвоить нельзя, так что и адрес которого получить невозможно.

Решить проблему можно разными способами. Например, создавать реальные l-value:

Rectangle r(10); 
p_shapes[1] = &r; 

Второй вариант - создать объект динамически:

p_shapes[1] = new Rectangle(10);

Аналог ваших действий с более простыми типами — как если бы вы пытались получить адрес не переменной, а какой-нибудь двойки:

int * ptr = &2;

Пояснять невозможность этого действия, думаю, не надо? А вот так вот вполне можно:

int i = 2;
int * ptr = &i;
→ Ссылка