Подтвердить что ты не робот

Частный конструктор

Возможный дубликат:
Какая польза от создания конструктора в классе?

Где нам нужен частный конструктор? Как мы можем создать экземпляр класса с помощью частного конструктора?

4b9b3361

Ответ 1

Частный конструктор означает, что пользователь не может напрямую создать экземпляр класса. Вместо этого вы можете создавать объекты, используя Именованный конструктор Idiom, где у вас есть функции static класса, которые могут создавать и возвращать экземпляры класса.

Идиома Именованного конструктора предназначена для более интуитивного использования класса. Пример, предоставленный в FAQ С++, относится к классу, который может использоваться для представления нескольких систем координат.

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

 #include <cmath>               // To get std::sin() and std::cos()

 class Point {
 public:
   static Point rectangular(float x, float y);      // Rectangular coord's
   static Point polar(float radius, float angle);   // Polar coordinates
   // These static methods are the so-called "named constructors"
   ...
 private:
   Point(float x, float y);     // Rectangular coordinates
   float x_, y_;
 };

 inline Point::Point(float x, float y)
   : x_(x), y_(y) { }

 inline Point Point::rectangular(float x, float y)
 { return Point(x, y); }

 inline Point Point::polar(float radius, float angle)
 { return Point(radius*std::cos(angle), radius*std::sin(angle)); }

Было много других ответов, которые также соответствуют духу того, почему частные конструкторы когда-либо используются в С++ (шаблон Singleton среди них).

Еще одна вещь, которую вы можете сделать с этим: предотвратить наследование вашего класса, поскольку производные классы не смогут получить доступ к вашему классу, конструктор. Конечно, в этой ситуации вам все равно нужна функция, которая создает экземпляры класса.

Ответ 2

Одно общее использование в шаблоне singleton, где вы хотите, чтобы существовал только один экземпляр класса. В этом случае вы можете предоставить метод static, который создает экземпляр объекта. Таким образом можно управлять количеством объектов, созданных для определенного класса.

Ответ 3

частный конструктор полезен, когда вы не хотите, чтобы ваш класс был создан пользователем. Чтобы создать такие классы, вам нужно объявить статический метод, который делает "новый" и возвращает указатель.

Класс с частными ctors не может быть помещен в контейнеры STL, так как им требуется копия ctor.

Ответ 4

Разумно сделать конструктор закрытым, если есть другие методы, которые могут создавать экземпляры. Очевидными примерами являются шаблоны Singleton (каждый вызов возвращает один и тот же экземпляр) и Factory (каждый вызов обычно создает новый экземпляр).

Ответ 5

Это обычное явление, когда вы хотите реализовать синглтон. Класс может иметь статический метод factory ", который проверяет, был ли класс уже создан, и вызывает конструктор, если он не имеет.

Ответ 6

Например, вы можете вызвать частный конструктор внутри класса друга или функции друга.

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

Ответ 7

Одно из распространенных применений для обходных классов template-typedef, таких как:

template <class TObj>
class MyLibrariesSmartPointer
{
  MyLibrariesSmartPointer();
  public:
    typedef smart_ptr<TObj> type;
};

Очевидно, что и открытый нереализованный конструктор будет работать, но частный конструктор создает ошибку времени компиляции вместо ошибки времени ссылки, если кто-то пытается установить MyLibrariesSmartPointer<SomeType> вместо MyLibrariesSmartPointer<SomeType>::type, что желательно.