2008-11-12 83 views
3

我正在爲一個類創建一個接口包裝。類中的成員是一個參考(以避免複製大型結構)。如果我創建一個私有構造函數,那麼初始化該引用以安撫編譯器的最佳方式是什麼?如何使用私有構造函數的引用成員來初始化類?

struct InterfaceWrapper { 
    InterfaceWrapper(SomeHugeStructure& src):m_internal(src){}; 
    int someElement(void) const { return m_internal.someElement; }; 
private: 
    InterfaceWrapper(){} // initialize m_internal 
    SomeHugeStructure& m_internal; 
}; 

回答

4

正如其他人所提到的,如果你的目的是爲了防止他人從調用默認的構造函數,那麼你不想提供身體所有,並宣佈這是不必要的,因爲你有另一個構造函數,編譯器榮獲」爲你生成它。

如果目的是限制訪問類的朋友,那麼你很可能是具有指針(prefereably智能指針)成員,並設置爲NULL最好的。

-

而且,我不知道你爲什麼做這樣的結構,而不是一類。一般來說,當你將數據成員公開爲public時,結構是有意義的,類似於C.在這種情況下,看起來你有一個常規的類,在這種情況下,C++約定就是使它成爲一個類。

4

如果你確實需要構造沒有元素的類,那麼引用不是要走的路。

如果您使用僅供參考原因是爲了避免抄襲,我建議使用一個指針。 您可以簡單地在您的常規構造函數中獲取傳入引用的地址,並在私有構造函數中將其初始化爲NULL。當對象的生命週期結束時,指針將是一個懸掛指針,但對於引用也是如此......

或者,讓公共構造函數帶一個智能指針並使用這樣的智能指針作爲成員,關心生命。

當然而且,配合指針可能是NULL在該類的代碼的其餘部分。 (但你不得不應付成員可能是在基準情況下也存根,所以這不是一個真正的問題)

1

什麼是私有構造函數的意義呢?如果m_internal沒有引用一個有效的對象,那它有什麼用處?

另外,m_internal->將無法編譯。這是指針語法,而不是參考。

2

如果您正在默認的構造函數私有,以防止任何人使用它,把它留在身軀:

private: 
    InterfaceWrapper(); 
    SomeHugeStructure& m_internal; 

編譯器會認爲這是在其他地方定義,鏈接器不會介意它的除非有人試圖使用它。

+0

如果您定義了任何其他構造函數,編譯器不會自動生成默認構造函數。所以在這種情況下,它可以安全地從代碼中刪除。 – 2008-11-12 17:08:41

相關問題