c++ - que - ¿Cuáles son los usos prácticos de un constructor protegido?
que es un constructor en c++ (8)
¿Por qué alguien declararía un constructor protegido? Sé que los constructores se declaran privados con el fin de no permitir su creación en la pila.
Cuando una clase es (pensada como) una clase abstracta, un constructor protegido es exactamente correcto. En esa situación, no desea que los objetos se instalen desde la clase, sino que solo se utilizan para heredar.
Hay otros casos de uso, como cuando un determinado conjunto de parámetros de construcción debe limitarse a las clases derivadas.
Los constructores no públicos son útiles cuando existen requisitos de construcción que no pueden ser garantizados únicamente por el constructor. Por ejemplo, si es necesario llamar a un método de inicialización justo después del constructor, o si el objeto necesita registrarse con algún objeto contenedor / administrador, esto debe hacerse fuera del constructor. Al limitar el acceso al constructor y proporcionar solo un método de fábrica, puede asegurarse de que cualquier instancia que reciba un usuario cumpla con todas sus garantías. Esto también se usa comúnmente para implementar un Singleton, que en realidad es solo otra garantía más de la clase (que solo habrá una instancia).
La razón para hacer que el constructor esté protegido, en lugar de privado, es el mismo que para hacer que cualquier otro método o campo esté protegido en lugar de privado: para que los niños puedan heredarlo. Quizás desee un método de fábrica público y no virtual en la clase base, que devuelva referencias a instancias de las clases derivadas; las clases derivadas obviamente quieren acceso a los constructores principales, pero aún así no desea crearlas fuera de su fábrica.
Para los métodos de fábrica con efectos secundarios.
class mine {
private:
mine () {};
protected:
mine(int id) : m_id(id) {};
int m_id;
static int m_count;
public:
static mine* CreateOneOfMe() {
return mine(m_count++);
}
int GetId() { return m_id; }
};
Esto crea instancias de la clase y garantiza que cada una de ellas tenga un ID de entero incremental único. Tenga en cuenta que si el constructor que desea usar no es el predeterminado, también debe ocultar el predeterminado.
Para permitir que una subclase use un constructor que no debería ser accesible a un instanciador directamente.
Podría usarlo para limitar las clases que podrían crearlo, por ejemplo:
class Level
{
private:
Level();
¨Level();
friend class LevelManager;
};
La única clase que puede crear una instancia es la clase LevelManager, por lo que siempre sabrá que la instancia Level se crea en el LevelManager.
Se puede utilizar un constructor protegido para hacer que una clase se abstraiga efectivamente cuando ninguno de sus métodos es puramente virtual.
No es bastante abstracto en el sentido de C ++, ya que las clases de amigos aún pueden usarlo sin anularlo, pero entonces tendrías que declararlo.
Un constructor protegido significa que solo los miembros derivados pueden construir instancias de la clase (y las instancias derivadas) usando ese constructor. Esto suena un poco a gallina y huevo, pero a veces es útil al implementar fábricas de clase.
Un uso podría ser patrones de fábrica.