3

私は小さな C++ アプリを構築しており、リファレンス ホルダー用のプライベート コピー コンストラクターを作成しようとしていました。

メインでクラスを使用するとすべてが機能しますが、Google Test でテストしようとすると、コピー コンストラクターがプライベートであるというエラーが表示されます

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);
};

プライベート コピー コンストラクターでエラーが発生するのはなぜですか (テストでの不適切な使用でしょうか?)。

4

3 に答える 3

8

ここ

Library lib = Library("my Library");

RHS で構築された一時オブジェクトからコピー構築を意味的に実行しています。コンパイラがコピーを最適化する場合でも、コピー コンストラクターはパブリックにアクセスできる必要があります。

代わりにこれを試してください:

Library lib("my Library");

コピーの初期化の詳細を参照してください。

于 2013-04-28T17:43:41.303 に答える
4
Library lib = Library("my Library");

この行では、 type のオブジェクトをコピー構築しようとしていますLibraryが、そのコピー コンストラクターが非公開であるため、これを行うことはできません。代わりにこれを行う必要があります:

Library lib("my Library");
于 2013-04-28T17:42:41.710 に答える
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");
于 2013-04-28T17:45:38.720 に答える