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 關注
- 476 瀏覽
添加回答
舉報