5

次の問題があります。インスタンスを返すgetInstanceメンバー関数を持つシングルトンがあります。私はこれをコードのどこかで呼び出しますが、何らかの理由でVCはコピーコンストラクターを呼び出そうとします。どうしてこれなの?これを修正するにはどうすればよいですか?

ヘッダー:

class FileSystemEntryCollection {
public:
    static FileSystemEntryCollection &getInstance();
private:
    FileSystemEntryCollection();
    FileSystemEntryCollection(FileSystemEntryCollection const&);
    void operator=(FileSystemEntryCollection const&);
}

ソースファイル:

FileSystemEntryCollection &FileSystemEntryCollection::getInstance() {
    static FileSystemEntryCollection instance = FileSystemEntryCollection();
    return instance;
}

次の行は、コピーコンストラクターを呼び出します。

auto collection = FileSystemEntryCollection::getInstance();

関連するコードを残そうとしましたが、他に何か必要な場合はお知らせください。

4

3 に答える 3

6
auto collection = FileSystemEntryCollection::getInstance();

する必要があります:

auto& collection = FileSystemEntryCollection::getInstance();
    ^

autoそれ自体が参照型になることはありません。

于 2012-08-18T18:30:36.447 に答える
3

別のコンパイラを使用すると、の初期化で同じエラーが発生しますinstance

static FileSystemEntryCollection instance = FileSystemEntryCollection();

ここ=ではコピーの構築が必要です。正式には、コンパイラは一時的な(FileSystemEntryCollection())を作成し、それをにコピーしinstanceます。ただし、この状況では、コンパイラーはコピーの作成をスキップして、オブジェクトを直接その場で作成することができます。それがあなたのコンパイラがしていることです。ただし、コンパイラはこれを行う必要はありません。

より良い:

static FileSystemEntryCollection instance;

これは、デフォルトのコンストラクターを使用してを作成しますinstance

于 2012-08-18T18:49:56.883 に答える
0

静的シングルトンオブジェクトを構築するソースファイル内でコピーコンストラクターを1回呼び出します。

于 2012-08-18T18:35:16.387 に答える