Возможный дубликат:
Какая польза от создания конструктора в классе?
Где нам нужен частный конструктор? Как мы можем создать экземпляр класса с помощью частного конструктора?
Возможный дубликат:
Какая польза от создания конструктора в классе?
Где нам нужен частный конструктор? Как мы можем создать экземпляр класса с помощью частного конструктора?
Частный конструктор означает, что пользователь не может напрямую создать экземпляр класса. Вместо этого вы можете создавать объекты, используя Именованный конструктор 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 среди них).
Еще одна вещь, которую вы можете сделать с этим: предотвратить наследование вашего класса, поскольку производные классы не смогут получить доступ к вашему классу, конструктор. Конечно, в этой ситуации вам все равно нужна функция, которая создает экземпляры класса.
Одно общее использование в шаблоне singleton, где вы хотите, чтобы существовал только один экземпляр класса. В этом случае вы можете предоставить метод static
, который создает экземпляр объекта. Таким образом можно управлять количеством объектов, созданных для определенного класса.
частный конструктор полезен, когда вы не хотите, чтобы ваш класс был создан пользователем. Чтобы создать такие классы, вам нужно объявить статический метод, который делает "новый" и возвращает указатель.
Класс с частными ctors не может быть помещен в контейнеры STL, так как им требуется копия ctor.
Разумно сделать конструктор закрытым, если есть другие методы, которые могут создавать экземпляры. Очевидными примерами являются шаблоны Singleton (каждый вызов возвращает один и тот же экземпляр) и Factory (каждый вызов обычно создает новый экземпляр).
Это обычное явление, когда вы хотите реализовать синглтон. Класс может иметь статический метод factory ", который проверяет, был ли класс уже создан, и вызывает конструктор, если он не имеет.
Например, вы можете вызвать частный конструктор внутри класса друга или функции друга.
Шаблон Singleton обычно использует его, чтобы убедиться, что никто не создает больше экземпляров предполагаемого типа.
Одно из распространенных применений для обходных классов template-typedef, таких как:
template <class TObj>
class MyLibrariesSmartPointer
{
MyLibrariesSmartPointer();
public:
typedef smart_ptr<TObj> type;
};
Очевидно, что и открытый нереализованный конструктор будет работать, но частный конструктор создает ошибку времени компиляции вместо ошибки времени ссылки, если кто-то пытается установить MyLibrariesSmartPointer<SomeType>
вместо MyLibrariesSmartPointer<SomeType>::type
, что желательно.