预订错误? 2002年指向对象的数组

时间:2017-11-02 16:38:35

标签: c++ arrays pointers object

我正在阅读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;

}

1 个答案:

答案 0 :(得分:3)

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

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

因此,现代C ++编译器将此视为错误(&#34;获取临时&#34;的地址)并拒绝生成代码。