¿Por qué alguien declararía que un constructor estaba protegido? Sé que los constructores se declaran privados con el propósito de no permitir su creación en la pila.¿Cuáles son los usos prácticos de un constructor protegido?
Respuesta
Cuando una clase es (destinada como) una clase abstracta, un constructor protegido es exactamente correcto. En esa situación, no desea que los objetos sean instanciados de la clase, sino solo usarlos para heredar.
Existen otros casos de uso, como cuando un cierto conjunto de parámetros de construcción debe limitarse a las clases derivadas.
un uso podría ser patrones de fábrica
Un constructor protegido significa que los miembros solamente derivados pueden construir instancias de la clase (y casos derivados) que utilizan ese constructor. Esto suena un poco al huevo y la gallina, pero a veces es útil cuando se implementan fábricas de clase.
Técnicamente, esto se aplica solo si TODOS los ctors están protegidos. – MSalters
las clases de amigo también pueden llamar al constructor protegido (no solo a las clases derivadas). –
...y el uso de una clase de amigo que llame al constructor protegido sería en el caso de un objeto que tiene miembros que son constantes (establecidos por el constructor) pero deben ser públicos, pero nunca deben ser establecidos por ningún otro acceso público, garantiza que el objeto no se creará en otro lugar y, por lo tanto, los datos tampoco se modificarán en ningún otro lado. – osirisgothra
Para permitir que una subclase utilice un constructor que no debe ser accesible a un instanciador directamente.
Usted puede usarlo para limitar las clases que podrían crear, por ejemplo:
class Level
{
private:
Level();
¨Level();
friend class LevelManager;
};
La única clase que puede crear una instancia de ella es la clase LevelManager, por lo que siempre sabrá que el nivel instancia se crea en el LevelManager.
Si bien es cierto, es un constructor privado, no protegido. – David
ahaha lo siento, he leído mal. ¿Debo eliminar mi publicación? –
Los constructores no públicos son útiles cuando hay requisitos de construcción que no pueden ser garantizados únicamente por el constructor. Por ejemplo, si un método de inicialización necesita ser llamado 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 un usuario reciba 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 que hace la clase (que solo habrá una sola 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 pueda ser heredado por los niños. Quizás desee un método de fábrica público, no virtual en la clase base, que devuelve referencias a instancias de las clases derivadas; las clases derivadas, obviamente, quieren acceso a los constructores originales, pero todavía no desea crearlos fuera de su fábrica.
Para 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 tiene una identificación entera de incremento única. Tenga en cuenta que si el constructor que desea utilizar no es el predeterminado, también debe ocultar el predeterminado.
Un constructor protegido se puede usar para hacer que una clase sea efectivamente abstracta cuando ninguno de sus métodos es puro-virtual.
No es muy abstracto en el sentido C++ ya que las clases de amigos todavía pueden usarlo sin sobrescribir, pero entonces tendrías que declararlos.
- 1. ¿Cuáles son los usos prácticos de Factory Method Pattern?
- 2. ¿Cuáles son los usos prácticos del módulo (%) en la programación?
- 3. SQLite: ¿cuáles son los límites prácticos?
- 4. jQuery .each() - ¿Usos prácticos?
- 5. ¿Usos prácticos para tipos estructurales?
- 6. ¿Cuáles son los usos de buffer circular?
- 7. ¿Cuáles son los usos de Cross Join?
- 8. ¿Cuáles son los usos de svn copy?
- 9. Usos prácticos de TypedReference
- 10. ¿Cuáles son los usos comunes de UDP?
- 11. Comportamiento explícito del constructor de copias y usos prácticos
- 12. Usos prácticos de MethodRental Class?
- 13. Usos prácticos de un tipo dinámico en Scala
- 14. ¿Cuáles son los buenos usos de los módulos empaquetados OCaml?
- 15. ¿Cuáles son los diferentes usos de los [corchetes] en Ruby?
- 16. ¿Cuáles son algunos usos prácticos para las variables const const en C?
- 17. ¿Cuáles son los usos de los tipos polimórficos?
- 18. ¿Cuáles son algunos usos interesantes/prácticos para matrices con tres o más dimensiones?
- 19. ¿Cuáles son algunos usos de los metadatos de Clojure?
- 20. ¿Cuáles son algunos de los usos inteligentes de LINQ?
- 21. ¿Cuáles son los mejores usos de las tiendas de documentos?
- 22. ¿Cuáles son algunos usos de los cierres para OOP?
- 23. Iron Python: cuáles son los buenos usos de Iron Python
- 24. ¿Cuáles son los usos del código de auto modificación?
- 25. ¿Cuáles son los usos de la construcción C++ "placement new"?
- 26. ¿Cuáles son los usos de funciones virtuales puras en C++?
- 27. ¿Cuáles son los usos de las subrutinas lvalue en Perl?
- 28. ¿Cuáles son todos los usos de '@' en C#?
- 29. ¿Cuáles son los usos del predicado de falla en Prolog?
- 30. ¿Cuáles son algunos usos interesantes para los agentes de Java?
+1 Pero no necesariamente tiene que ser una clase abstracta. Sin embargo, a menudo es el caso. – ralphtheninja
¿No es suficiente declarar que una función es puramente virtual para definir una clase base? O lo anterior es en ausencia de la función virtual pura. ¿Qué es un evento de creación para una clase Derivada de una clase abstracta de este tipo? –
@Henk Holterman Ciertamente sí; consulte la Sección 10.4 del Estándar C++, titulada "Clases abstractas" –