2015-02-03 2 views
2

Пока я читал о том, что не разрешаю определять дополнительные экземпляры одного объекта. Но я не могу снова найти эту статью. Может ли кто-нибудь сказать мне, как предотвратить определение любого другого объекта из класса CLog?Запретить определение нескольких экземпляров класса

class CLog 
{ 
........ 


} log; 
+7

Google * Singleton pattern *, а затем прочитайте о том, почему вы [не должны их использовать] (http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you -Никогда-был-так-1995 /). – Praetorian

+0

@Praetorian Я хочу предотвратить определение log2 и log3 .... Даже если моя программа находится в моде отладочной, вы считаете, что я должен ее избегать? – barej

+0

Режим отладки не имеет ничего общего с вашими определениями. Да, Синглтон - ваш ответ%) –

ответ

0

Альтернативным решением для однотонного использования является использование шаблона Service Locator.

Хорошее описание и способы его использования описаны в http://gameprogrammingpatterns.com/service-locator.html.

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

-1

Сделайте свой конструктор закрытым. Определите один открытый метод, который возвращает экземпляр класса.

class sample{ 
private: 
    sample(){}; 
    static *sample instance; 
public: 
static *sample getInstance(){ 
    if (instance != null) 
     instance = new sample(); 
    return instance; 
} 

деЫпзЬапса() создает экземпляр класса перед созданием он проверяет, существует ли экземпляр, если он существует, то он Retuns существующей иначе создает новый one.In таким образом, вы можете сделать свой класс, чтобы создать единственный экземпляр класса , Поскольку конструктор является закрытым, никто не может создавать объекты с помощью конструктора.

+0

Это не поточно-безопасный; сделать сам экземпляр локальным статичным. – rubenvb

+0

в сущности, конечно, класс не является потокобезопасным, а * находится в неправильном месте, и у вас нет отключенной копии-конструкции – CashCow

+0

@rubenv, которая является одноэлементным Мейерсом. стандарт C++ 11 объявляет, что ваша конструкция действительно потокобезопасна, но порядок уничтожения не определен. call_once - хороший способ пойти слишком – CashCow

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