如何初始化指针成员以指向其封装实例?

时间:2014-03-15 20:50:07

标签: c++ pointers initialization this forward-declaration

假设我有以下内容:

class A; // forward declaration

class A {
public:
    A(A* parent) : parent(parent) {}
    A* parent;
    virtual void foo() = 0;
};

class B : public A {
public:
    B() : A(this) {}
    void foo() {}
};

在实例化类B的两个单独实例时,parent指针在每个实例中都是相同的。知道为什么吗?

编辑:我相信上面的内容现在更接近我的代码中的模型。

2 个答案:

答案 0 :(得分:1)

您需要编写一个复制构造函数。复制实例时不会调用默认构造函数,编译器生成的复制构造函数将从原始实例复制parent指针。

A(A const &other) : parent(this) {}

您可能也想编写一个复制赋值运算符,以便在将一个实例分配给另一个实例时保留parent指针。

另外,请考虑从parent已更改其默认值的实例进行复制或分配时应执行的操作。在这种情况下,副本/受让人是否应该获得与原始父母相同的父母?如果是这样,您的复制构造函数和赋值运算符将必须检查parent == this是否具有不同的行为,具体取决于结果。使用nullptr作为默认值可能更简单 - 无论哪种方式你需要对没有父项的实例进行特殊情况处理,但是空指针至少使它明显没有&# 34;实"已经分配了父母。

答案 1 :(得分:0)

在类定义后添加分号。您提供的示例中缺少它。编译器有时会为此提供含义错误的消息。