3 回答
TA贡献1868条经验 获得超4个赞
在你宣布你的会员的时候,你还在定义的A类,所以类型A仍然是不确定的。
但是,当你写A*,编译器已经知道A代表一个类名,所以输入“指针A”的定义。这就是为什么您可以将指针嵌入到正在定义的类型的原因。
相同的逻辑也适用于其他类型,因此,如果您只写:
class Foo;
您声明了Foo类,但从未定义。你可以写:
Foo* foo;
但不是:
Foo foo;
另一方面,A如果编译器允许递归定义,则您希望您的类型使用哪种内存结构?
但是,有时在逻辑上有效的是拥有某种以某种方式引用同一类型的另一个实例的类型。人们通常为此使用甚至更好的指针:智能指针(例如boost::shared_ptr),以避免必须进行手动删除。
就像是:
class A
{
private:
boost::shared_ptr<A> member;
};
TA贡献1865条经验 获得超7个赞
这是您要实现的目标的一个可行示例:
class A {
public:
A() : a(new A()) {}
~A() { delete a; a = nullptr; }
private:
A* a;
};
A a;
快乐堆栈溢出!
TA贡献1895条经验 获得超7个赞
A 直到定义末尾为止都是“不完整的”(尽管不包括成员函数的主体)。
原因之一是,在定义结束之前,没有办法知道大小A(取决于成员大小的总和,以及其他一些事情)。您的代码就是一个很好的例子:类型A由type的大小定义A。
显然,type的对象A可能不包含type 的成员对象A。
您将必须存储一个指针或引用。想要存储任何一个都可能令人怀疑。
- 3 回答
- 0 关注
- 442 浏览
添加回答
举报