书中的代码略有更新。我不知道为什么它会出错,最令人惊讶的是,它会在不是我编写的代码中出错!
#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";
}
}
您的错误是由于您正在创建一个 r 值,即 一个纯粹的临时对象,可以赋值,但不能赋值,因此无法获取其地址。
您可以通过不同的方式解决问题。例如,创建真正的左值:
第二个选项是动态创建对象:
使用更简单的类型来模拟您的操作 - 就好像您试图获取的不是变量的地址,而是一些平分:
解释这个动作的不可能性,我想,是不是必须的?在这里很有可能: