Ste*_*ing 36 c++ types member private-members incomplete-type
我有一个类应该有一个同一个类的私有成员,如:
class A {
private:
A member;
}
Run Code Online (Sandbox Code Playgroud)
但它告诉我,成员是一个不完整的类型.为什么?如果我使用指针,它不会告诉我不完整的类型,但我宁愿不使用指针.任何帮助表示赞赏
ere*_*eOn 39
在你宣布你的会员的时候,你还在定义的A类,所以类型A仍然是不确定的.
但是,当你写A*,编译器已经知道A代表一个类名,所以输入"指针A"的定义.这就是为什么你可以嵌入指向你定义的类型的指针.
同样的逻辑也适用于其他类型,所以如果你只写:
class Foo;
Run Code Online (Sandbox Code Playgroud)
您声明了类Foo,但您从未定义它.你可以写:
Foo* foo;
Run Code Online (Sandbox Code Playgroud)
但不是:
Foo foo;
Run Code Online (Sandbox Code Playgroud)
另一方面,A如果编译器允许递归定义,您期望什么样的内存结构?
但是,它有时在逻辑上有效,有一种类型,以某种方式引用相同类型的另一个实例.人们通常使用指针甚至更好:智能指针(如boost::shared_ptr)避免必须处理手动删除.
就像是:
class A
{
private:
boost::shared_ptr<A> member;
};
Run Code Online (Sandbox Code Playgroud)
Nic*_*ick 26
这是您要实现的目标的一个实例:
class A {
public:
A() : a(new A()) {}
~A() { delete a; a = nullptr; }
private:
A* a;
};
A a;
Run Code Online (Sandbox Code Playgroud)
快乐堆栈溢出!
A 在其定义结束之前是"不完整的"(尽管这不包括成员函数的主体).
其中一个原因是,在定义结束之前,无法知道有多大A(这取决于成员的大小总和,以及其他一些事情).您的代码就是一个很好的例子:您的类型A由类型的大小定义A.
显然,类型的对象A可能不包含也是类型的成员对象A.
你必须存储指针或引用; 想要存储任何一个都可能是怀疑.
| 归档时间: |
|
| 查看次数: |
68636 次 |
| 最近记录: |