书错了?2002 年指向对象的指针数组

Book mistake? Array of pointers to objects in 2002

本文关键字:对象 指针 数组 错了 2002      更新时间:2023-10-16

我正在阅读Herbert Schildt(2002)的一本书并学习虚函数。那里有一个示例程序,作者保证它是可编译的。但是,编译器不会编译它。编译器说问题出在

shapes[0] = &Square(2.0);

它可能与指向对象的指针数组有关,也可能与 C++11 有关(如果是这样,我不明白为什么要禁用数组的此功能)。该程序有点长,所以我对其进行了剪切并简化了它以隔离问题并使其易于阅读。

#include <iostream>
using namespace std;
// Base class for two-dimensional objects:
    class TwoDShape {
    double side;
    char name[20];
public:
    TwoDShape(double x) {
        side = x;
    }
    double getSide() { return side; }
    void setSide(double w) { side = w; }
    virtual double area() = 0;
};
// Derived class for Squares:
class Square : public TwoDShape {
public:
    Square(double x) : TwoDShape(x) { };
    double area() { return getSide() * getSide(); }
};
int main() {
    TwoDShape *shapes[3];
    shapes[0] = &Square(2.0);
    shapes[1] = &Square(6.0);
    shapes[2] = &Square(9.0);
    return 0;

}

好吧,在 2000 年代左右编写的旧C++编译器(至少其中一些)实际上允许这样做。但是,在这里使用这种结构显然是错误的。

Square(x,y)创建一个临时对象,该对象在创建后立即被删除。因此,所有存储的指针都变得无效,并且程序不会仅仅因为它们不再使用而崩溃。

因此,现代C++编译器将此视为错误("临时地址")并拒绝生成代码。