假设我有以下内容:
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
指针在每个实例中都是相同的。知道为什么吗?
编辑:我相信上面的内容现在更接近我的代码中的模型。
答案 0 :(得分:1)
您需要编写一个复制构造函数。复制实例时不会调用默认构造函数,编译器生成的复制构造函数将从原始实例复制parent
指针。
A(A const &other) : parent(this) {}
您可能也想编写一个复制赋值运算符,以便在将一个实例分配给另一个实例时保留parent
指针。
另外,请考虑从parent
已更改其默认值的实例进行复制或分配时应执行的操作。在这种情况下,副本/受让人是否应该获得与原始父母相同的父母?如果是这样,您的复制构造函数和赋值运算符将必须检查parent == this
是否具有不同的行为,具体取决于结果。使用nullptr
作为默认值可能更简单 - 无论哪种方式你需要对没有父项的实例进行特殊情况处理,但是空指针至少使它明显没有&# 34;实"已经分配了父母。
答案 1 :(得分:0)
在类定义后添加分号。您提供的示例中缺少它。编译器有时会为此提供含义错误的消息。