为了账号安全,请及时绑定邮箱和手机立即绑定

提问类中的“不完整类型”,其成员具有与类本身相同的类型

提问类中的“不完整类型”,其成员具有与类本身相同的类型

皈依舞 2019-11-03 08:04:31
我有一个班级,应该有一个属于同一班级的私人成员,例如:class A {    private:        A member;}但这告诉我成员是不完整的类型。为什么?如果使用指针,它不会告诉我不完整的类型,但我宁愿不使用指针。任何帮助表示赞赏
查看完整描述

3 回答

?
MYYA

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;

};



查看完整回答
反对 回复 2019-11-04
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

这是您要实现的目标的一个可行示例:


class A {

public:

    A() : a(new A()) {}

    ~A() { delete a; a = nullptr; }

private:

    A* a;

};


A a;

快乐堆栈溢出!



查看完整回答
反对 回复 2019-11-04
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

A 直到定义末尾为止都是“不完整的”(尽管不包括成员函数的主体)。


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


显然,type的对象A可能不包含type 的成员对象A。


您将必须存储一个指针或引用。想要存储任何一个都可能令人怀疑。



查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 442 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信