类中的"不完整类型",它具有类本身的相同类型的成员

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)

  • @Sterling:_owning_类包含"nowPosition"和"previousPosition"成员可能更有意义.职位是一个职位; 它不需要知道其他职位. (9认同)

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".关于阶级破坏.我们不需要教导年轻程序员泄漏记忆的例子比他们自己做的更多. (4认同)
  • 或者使用智能指针......`unique_ptr <A> a;` (2认同)

Lig*_*ica 5

A 在其定义结束之前是"不完整的"(尽管这不包括成员函数的主体).

其中一个原因是,在定义结束之前,无法知道有多大A(这取决于成员的大小总和,以及其他一些事情).您的代码就是一个很好的例子:您的类型A由类型的大小定义A.

显然,类型的对象A可能不包含也是类型的成员对象A.

你必须存储指针或引用; 想要存储任何一个都可能是怀疑.