частные конструкторы с ++ - PullRequest
3 голосов
/ 04 ноября 2010

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

Ответы [ 4 ]

3 голосов
/ 04 ноября 2010

Создание частного конструктора для фабричного метода.Шаблон синглтона нуждается в фабричном методе.
boost не копируется, если вы не хотите, чтобы ваш класс копировался, но, как уже заметил Джеймс МакНеллис: решите, должны ли пользователи иметь возможность копировать класс.Поскольку необработанные указатели и встроенное управление памятью больше не должны иметь места в классах, вопрос о том, чтобы скопировать классы, в основном предназначен для классов, которые используют ресурсы или, возможно, большие контейнеры.

2 голосов
/ 04 ноября 2010

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

Singleton * s;
Singleton copy( *s );

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

class Singleton
{
private:
  Singleton();
  Singleton(const Singleton &);
  Singleton & operator = (const Singleton &);
};
0 голосов
/ 04 ноября 2010

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

0 голосов
/ 04 ноября 2010

Да, обычно вы должны. Если нет, вы можете сконструировать новый объект с помощью копии:

MyClass newObject = your_singleton_of_type_MyClass;

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

...