亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

類中的“不完整類型”,其成員具有與類本身相同的類型

類中的“不完整類型”,其成員具有與類本身相同的類型

C++
jeck貓 2019-10-11 14:32:07
我有一個班級,應該有一個屬于同一班級的私人成員,例如:class A {    private:        A member;}但這告訴我成員是不完整的類型。為什么?如果使用指針,它不會告訴我不完整的類型,但我寧愿不使用指針。任何幫助表示贊賞
查看完整描述

3 回答

?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

在你宣布你的會員的時候,你還在定義的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-10-11
?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

這是您要實現的目標的一個可行示例:


class A {

public:

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

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

private:

    A* a;

};


A a;

快樂堆棧溢出!


查看完整回答
反對 回復 2019-10-11
?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

A 直到定義末尾為止都是“不完整的”(盡管不包括成員函數的主體)。


原因之一是,在定義結束之前,沒有辦法知道大小A(取決于成員大小的總和,以及其他一些事情)。您的代碼就是一個很好的例子:類型A由type的大小定義A。


顯然,type的對象A可能不包含type 的成員對象A。


您將必須存儲一個指針或引用。想要存儲任何一個都可能令人懷疑。


查看完整回答
反對 回復 2019-10-11
  • 3 回答
  • 0 關注
  • 471 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號