2013-02-03 23 views
2

如果我定義了一個嵌套類,然後創建這樣一個實例:如何創建一個在封閉類之外定義的嵌套類的實例?

class A 
{ 
    class B 
    { 
     ... 
    }; 
    B b; 
}; 

一切正常。但是,如果我只是在A之內聲明B並在外部定義它,我不能創建B的一個實例,可能是因爲編譯器不知道B實例需要多少空間。但是當你在另一個類中定義一個類的時候,代碼是不太可讀的。有沒有辦法做到這一點?

class A 
{ 
    class B; 
    B b; 
}; 
class A::B 
{ 
    ... 
}; 
+0

如果你已經是一個向前聲明(這是一個不完整的類型,像你說的),你需要一個指針。如果你想在類之外定義一些東西,把成員的聲明放在那裏,然後做'void A :: B :: foo(){}'。 – chris

+0

是的,但即使當你只將嵌套類的聲明放在裏面並定義外部時,我認爲它會使得封閉類更不可讀。無論如何,非常感謝你! – user2038014

回答

1

操作簡單,只需定義類B,然後在A.

class B 
{ 
} 
class A 
{ 
    B memberB; 
} 

定義它的一個實例,也可以轉發它聲明:

class B; 
class A 
{ 
    B memberB; 
} 
class B 
{ 
} 

真正嵌套類很少需要並不是很有用。

+0

也許它不是很有用,但它會限制某人從外部實例化嵌套類,對吧? – user2038014

+1

這很哈克,我會避免它,但你總是可以給B一個私人的構造函數,並使A成爲一個朋友。 – jmetcalfe

+1

不,他們仍然可以這樣做:$ A :: B instanceOfB;僅僅因爲B是嵌套的,並不意味着你不能創建它的一個實例。你爲什麼不解釋你想達到什麼目的? – ventsyv

1

當您使用類類型作爲成員時,需要知道具體類。這就是爲什麼你的第二種情況不起作用。一個解決方法是使用指針B

#include <memory> 
class A 
{ 
    class B; 
    std::unique_ptr<B> b; 
}; 
class A::B 
{  
}; 
相關問題