2013-04-28 100 views
3

我正在構建一個小型C++應用程序,我正在尋找一個私人拷貝構造函數給我的引用持有者。C++私人拷貝構造函數問題

當我使用我的課,我在主體,一切正常,但是當我嘗試與谷歌測試來測試它,我得到一個錯誤,指出我的拷貝構造函數是私有

TEST (Library, constructorParams) { 
    Library lib = Library("my Library"); 
    ASSERT_EQ("my Library", lib.getNom()); 
} 

Library.h(有是沒有定義的拷貝構造函數,在我的.cpp的分配操作)

class Library { 
public: 
    ... 
private: 
    ... 

    Library (const Library& obj); 
    Library & operator=(const Library& obj); 
}; 

爲什麼我收到了我的私人拷貝構造函數中的錯誤(可能它是在我的測試一個不好的用法?)?

回答

8

這裏

Library lib = Library("my Library"); 

你在語義上執行從在RHS構建的臨時對象的拷貝構造。即使編譯器可能會優化副本,複製構造函數也需要公開訪問。

試試這個:

Library lib("my Library"); 

查看更多關於copy initialization

4
Library lib = Library("my Library"); 

在此行中嘗試複製構建Library類型的對象,但不能做它的拷貝構造函數是私有的。而應該這樣做:

Library lib("my Library"); 
2

要調用從該行代碼

Library lib = Library("my Library"); 

的拷貝構造函數和你已經將它定義爲類的私有方法。

該操作是不相關的賦值操作符(你的問題提)的調用,這是比較明顯的,如果你認爲它的等效:

Library lib(Library("my Library")); // Here the invocation of the copy 
            // constructor is more explicit 

隨着代碼以這種格式,它也更清楚的是,沒有必要先在臨時創建對象,而是調用複製構造函數來創建該對象的另一個實例。

正確的方法應該是:

Library lib("my Library");