在单例中使用已删除的复制构造函数

Sha*_*iar 4 c++ singleton c++11 c++14

我实现了像Singleton模式这个,还有我的代码:

头文件:

class Settings_manager{
public:
    static Settings_manager& get_instance();

    void operator=(Settings_manager const&) =delete;
    Settings_manager(Settings_manager const&) =delete;
...

private:
    Settings_manager();
};
Run Code Online (Sandbox Code Playgroud)

执行:

Settings_manager& Settings_manager::get_instance()
{
    static Settings_manager instance;
    return instance;
}

Settings_manager::Settings_manager()
{
    read_file();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用这样的get_instance函数main:

Settings_manager set = Settings_manager::get_instance();
Run Code Online (Sandbox Code Playgroud)

要么 Settings_manager set = std::move(Settings_manager::get_instance());

我明白了

error: use of deleted function 'Settings_manager::Settings_manager(const Settings_manager&)'
 Settings_manager set = Settings_manager::get_instance();
Run Code Online (Sandbox Code Playgroud)

有人能说出来,有什么不对并解释一下吗?谢谢.

Bar*_*rry 15

考虑一下你在这里要做的事情:

Settings_manager set = Settings_manager::get_instance();
Run Code Online (Sandbox Code Playgroud)

你有你的单身人士,get_instance()而你正试图复制它?如果你可以......创造其中两个正确的话,这会破坏单身人士的目的吗?

你想参考:

Settings_manager& set = Settings_manager::get_instance();
Run Code Online (Sandbox Code Playgroud)

这样,set 就是单例实例.不是它的副本.


120*_*arm 6

get_instance返回对单例的引用,然后将其存储在本地Settings_manager变量中,该变量需要进行复制. set应该是一个参考变量:

Settings_manager &set = Settings_manager::get_instance();
Run Code Online (Sandbox Code Playgroud)