2010-11-03 2 views
3

Если я не хочу разрешать кому-либо создавать экземпляр моего класса, кроме моих статических функций (я думаю, что это называется singleton/factory?), Достаточно ли сделать конструктор по умолчанию закрытым, или мне также нужно явно определить и сделать частным конструктор копирования и оператор присваивания?C++ private constructors

+0

Это зависит от многого. хотите ли вы, чтобы потребители класса могли копировать экземпляры, возвращаемые вашей статической функцией? –

+0

нет, хочу всего один экземпляр globaly – baruch

+0

@baruch: Так что сделайте только один. – GManNickG

ответ

2

Да, я бы сделал все 3 из этих функций менеджера. Если нет, вы не хотите иметь доступ к конструктору копирования. Например, это справедливо:

Singleton * s; 
Singleton copy(*s); 

Так что-то вроде:

class Singleton 
{ 
private: 
    Singleton(); 
    Singleton(const Singleton &); 
    Singleton & operator = (const Singleton &); 
}; 
0

Да, обычно вам нужно. Если нет, вы можете построить новый экземпляр:

MyClass newObject = your_singleton_of_type_MyClass; 

В этом случае выдается экземпляр копии, создавая на самом деле два объекта. Создание закрытого конструктора копии предотвращает копирование, делая этот код незаконным.

0

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

3

Заставить constuctor секретна для шаблона метода фабрики. Для одноэлементного шаблона необходим заводской метод.
Усиление неготовности, если вы не хотите, чтобы ваш класс был скопирован, но, как уже прокомментировал Джеймс Макнеллис, решите, должны ли пользователи копировать класс. Поскольку исходные указатели и встроенное управление памятью больше не должны иметь места в классах, вопрос о копировании классов в основном предназначен для классов, которые используют ресурсы или, возможно, большие контейнеры.