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

它在构造静态单例对象的源文件中调用一次复制构造函数。

于 2012-08-18T18:35:16.387 回答