2016-05-24 3 views
1

При попытке сделать создать единственный экземпляр класса, который потребует глобального доступа и модификации в это имя, у меня есть некоторые синтаксис связанный с этим вопрос (я думаю) с моим кодом в файле реализации.Singletons с аргументами конструктора

Когда я компилирую, я получаю ошибку оператора возврата:

неконстантной ссылки именующей к типу Single не может связываться с величиной несвязанного типа Single.

single.h

class Single{ 
public: 
    std::string getSingleName(); 
    void updateSingleName(std::string name); 
    void operator=(Single const&) = delete; 
    Single(Single const&) = delete; 
    static Single& getInstance(const std::string& name); 

private: 
    Single(std::string singleName); 
    std::string name; 
}; 

Single.cpp

Single& Single::getInstance(const std::string& name){ 
    Single single(std::string name); 
    return single; 
} 
+4

'Single single (std :: string name);' объявляет функцию. – molbdnilo

+0

/OT Не _Singleton ** s ** _ в названии противоречие само по себе? –

+0

Я бы хотел, чтобы люди перестали создавать глобальные переменные/синглеты :-( –

ответ

2

Вы забыли static ключевое слово single в getInstance. Чтобы вернуть ссылку, вам нужен постоянный объект. Мы делаем это со статическим как

Single& Single::getInstance(const std::string& name){ 
    static Single single(name); // get rid of the parameter type otherwise this is a function 
    return single; 
} 

Обратите внимание, что с single теперь static это только когда-либо построенное когда-то и любой последующий вызов getInstance будет возвращать один и тот же объект, как и предыдущий вызов.

Если вам нужно иметь несколько отдельных объектов, имеющих разные имена, вам понадобится нечто иное, чем одноэлемент. Возможно, просто избавиться от конструктора копирования и сделать его подвижным будет работать для вашего прецедента.

1

Сочетание аргументов singleton и constructor не имеет никакого смысла. Точка одиночной точки состоит в том, что (1) она существует не более одного раза, и (2) любой может получить объект singleton в любое время без проверки того, что кто-то уже его создал, что означает, что всем необходимо будет знать параметры, и, очевидно, они должны быть одинаковыми, иначе синглтон будет вести себя по-разному в зависимости от того, кто его создал.