2016-10-08 2 views
2

Я реализованного шаблон одноэлементный как this, есть мой код: ФайлИспользование удаленного конструктора копирования в синглтона

Заголовок:

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

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

private: 
    Settings_manager(); 
}; 

реализация:

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

Settings_manager::Settings_manager() 
{ 
    read_file(); 
} 

Когда я пытаюсь использовать функцию get_instance в main так:

Settings_manager set = Settings_manager::get_instance(); 

или 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(); 

Может кто-нибудь сказать, что это неправильно, и объяснить это? Благодарю.

ответ

10

Подумайте, что вы пытаетесь сделать здесь:

Settings_manager set = Settings_manager::get_instance(); 

У вас есть одиночки, get_instance(), и вы пытаетесь скопировать его? Это вроде бы поразило бы цель синглтона, если бы вы могли просто создать два из них правильно?

Вы хотите принять ссылку:

Settings_manager& set = Settings_manager::get_instance(); 

Таким образом, setявляется одноэлементный экземпляр. Не копия.

4

get_instance возвращает ссылку на ваш синглтон, который затем вы храните в локальной переменной Settings_manager, которая должна сделать копию. set должна быть ссылочная переменная:

Settings_manager &set = Settings_manager::get_instance();