c++ private-constructor

c++ - constructor privado



private-constructor (7)

Es común cuando quieres implementar un singleton. La clase puede tener un "método de fábrica" ​​estático que verifica si la clase ya se ha instanciado y llama al constructor si no lo ha hecho.

Posible duplicado:
¿De qué sirve hacer que el constructor sea privado en una clase?

¿Dónde necesitamos un constructor privado? ¿Cómo podemos crear una instancia de una clase que tenga un constructor privado?


Es razonable hacer que el constructor sea privado si hay otros métodos que pueden producir instancias. Los ejemplos obvios son patrones Singleton (cada llamada devuelve la misma instancia) y Factory (cada llamada generalmente crea una nueva instancia).


Por ejemplo, puede invocar un constructor privado dentro de una clase de amigo o una función de amigo.

El patrón Singleton usualmente lo usa para asegurarse de que nadie cree más instancias del tipo deseado.


Un uso común es en el patrón singleton en el que desea que exista solo una instancia de la clase. En ese caso, puede proporcionar un método static que ejemplifique el objeto. De esta forma, se puede controlar el número de objetos instanciados de una clase en particular.


Un uso común es para las clases de solución de tipo de definición de plantilla como las siguientes:

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

Obviamente, un constructor público no implementado también funcionaría, pero un constructor privado genera un error de tiempo de compilación en lugar de un error de tiempo de enlace, si alguien intenta instalar MyLibrariesSmartPointer<SomeType> lugar de MyLibrariesSmartPointer<SomeType>::type , que es deseable.


constructor privado son útiles cuando no desea que su clase sea instanciada por el usuario. Para instanciar dichas clases, necesita declarar un método estático, que hace el ''nuevo'' y devuelve el puntero.

No se puede poner una clase con ctors privados en los contenedores STL, ya que requieren un copiador.


Constructor privado significa que un usuario no puede instanciar directamente una clase. En su lugar, puede crear objetos utilizando algo como Named Constructor Idiom , donde tiene funciones de clase static que pueden crear y devolver instancias de una clase.

The Named Constructor Idiom es para un uso más intuitivo de una clase. El ejemplo proporcionado en C ++ FAQ es para una clase que se puede usar para representar sistemas de coordenadas múltiples.

Esto se saca directamente del enlace. Es una clase que representa puntos en diferentes sistemas de coordenadas, pero puede utilizarse para representar puntos de coordenadas Rectangulares y Polares, por lo que para que sea más intuitivo para el usuario, se usan diferentes funciones para representar qué sistema de coordenadas representa el Point devuelto.

#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)); }

Ha habido muchas otras respuestas que también se ajustan al espíritu de por qué los constructores privados se utilizan alguna vez en C ++ (entre ellos, el patrón Singleton).

Otra cosa que puedes hacer es evitar la herencia de tu clase , ya que las clases derivadas no podrán acceder al constructor de tu clase. Por supuesto, en esta situación, todavía necesita una función que crea instancias de la clase.