2010-11-03 6 views
3

Я новичок и немного невежественного в C++ и я сталкиваюсь код C++, который используется одноэлементный шаблон,Singleton шаблон в C++

class CFoo 
{ 
public: 
    static CFoo& getInstance() 
    { 
    static CFoo self; 
    return self; 
    } 

private: 
    CFoo(){} 
    ~CFoo(){} 
}; 

Я просто запутался, почему вернуть статическую ссылку? Это действительный код? Почему программист не использовал указатель?

ответ

7

Зачем использовать указатель? Ссылка проста и соответствует тому, что я хочу сделать: псевдоним объекта, а не указание на него. Код static не относится к ссылке, он применяется к функции, делая ее вызываемой без экземпляра.

(Еще лучше, why use a singleton?)

+0

+1, и я бы upvote @jalf тоже, если бы мог. –

+0

ОК. Синглтон используется и используется редко. Но это не мешает ему быть полезным. Проблема заключается в том, как мы учим людей использовать ее. Самый простой способ продемонстрировать, что такое синглтон (как указано выше), просто показывает синглтон, но не как правильно его использовать. Проблема с singleton (s) - это не одноэлементный шаблон, а его использование при предоставлении «глобально доступного изменяемого состояния». Хороший разговор о предмете: http://www.youtube.com/watch?v=-FRm3VPhseI –

+0

@Martin: Вы можете обобщить хорошее использование для синглета? – GManNickG

2

Статический локальной переменной, например, self после инициализации (один первый проход через функцию getInstance) остается на всю продолжительность программы, если явно не удален. Поэтому совершенно безопасно вернуть ссылку на self.

Обратите внимание, что это getInstance, которое является статичным в объявлении функции. Спецификаторы класса хранения не допускаются к типам возвращаемых функций.

Я хотел бы предложить вам использовать Monostate design pattern если, конечно, необходимость Singleton настоятельно предложил

1

Если вы используете указатель, вы должны разыменовываются указатель для того, чтобы использовать какие-либо перегруженные операторы, реализуемые CFoo , Если он возвращается указатель, код может выглядеть следующим образом:

(*(CFoo::getInstance())) == "comparison overloaded op" 

VS.

CFoo::getInstance() == "comparison overloaded op" 
+1

Пока правда, действительно ли имеет смысл сравнивать равенство на одноэлементном объекте? –

+0

Было бы, если равенство является перегруженным оператором. Может быть, вы управляете каким-либо государством по всему миру в одноэлементном режиме, и вы хотите запросить, находится ли программа в заданном состоянии? Может быть много причин проверять равенство singleton с * something *.Это так же легко может быть перегруженным унарным оператором «CFoo :: getInstance() ++». Строка была просто примером, показывающим, что он вызывает перегруженный оператор. – Nathan

Смежные вопросы