No estoy hablando de un puntero a una instancia, quiero un puntero a una clase en sí.En C++ puede tener un puntero a una función, ¿También puede tener un puntero a una clase?
Respuesta
En C++, las clases no son "first class objects". Lo más cerca que puede obtener es un puntero a su instancia type_info
.
No. Un puntero es la dirección de algo en la memoria de la computadora en tiempo de ejecución. Una clase es solo un conjunto de instrucciones para el compilador.
Sí y No. Esto depende de su contexto de lo que está tratando de lograr. Si simplemente desea un puntero a escriba, entonces no, no hay forma. Un tipo no vive en la memoria en el sentido de un puntero.
No hay razón por la que dije que sí, aunque algunas personas considerarían la tabla virtual como un puntero a un tipo. Es posible obtener este puntero ya que la tabla virtual existe en la memoria y se puede usar para invocar métodos virtuales con un poco de engaño.
Hay un pequeño problema con eso: una clase puede tener múltiples tablas virtuales cuando usa herencia múltiple. Además, si una clase hereda de otra pero no cambia ningún método virtual, creo que nada impide que el compilador combine las tablas virtuales de ambas clases. – CesarB
Es cierto, pero aún puede obtener un puntero a él. Personalmente, no considero que sea un apuntador pero sí mucha gente, así que pensé en publicarlo para completarlo. – JaredPar
A diferencia de los verdaderos lenguajes basados en objetos, una clase no es un objeto en C++, más es la pena. Lo más cerca que puede llegar a "puntero a clase" es RTTI:
const std :: type_info & info = typeid (expresión de objetos);
type_info tiene el fin de miembro name(), y se pueden comparar entre sí.
¿Qué idiomas son aquellos en los que puedo tener un objeto donde el tipo de ese objeto es un objeto (no un objeto que representa el tipo, ni una fábrica para dicho tipo, pero ¿dónde está realmente el tipo? –
Lo único que sé con certeza es Smalltalk. Java intenta hacerlo con getClass(), pero es inconsistente. – Arkadiy
@arkadly reflection (getClass) es muy diferente de lo que describes. Con la reflexión tienes un objeto que representa metadatos sobre un tipo. (Un tipo es una cosa de tiempo de ejecución, una clase es una cosa de tiempo de compilación, al menos en C++/Java/C# et al). Smalltalk podría estar allí, aunque recuerdo que es más una compilación para dicha clase que la clase que representa el objeto. Smalltalk está basado en objetos, no en clases (se opone a C++ basado en clases) –
Una "Clase" no existe. Lo único que puede señalar es la información.
El resto de una "Clase" es en realidad una tabla de envío. Para cada método en la clase, la tabla de envío tiene un puntero. De esta forma, la clase apunta al método correcto de su clase, independientemente del tipo al que esté actualmente emitido. Esto sería inútil para acceder.
Los métodos en su clase (las cosas apuntadas por la tabla de envío) son en realidad solo "Funciones" que se pasan en su puntero de datos de clase. La definición de un método es más o menos que es una función que toma los datos de las clases como un parámetro. En la mayoría de los lenguajes de estilo C, ese puntero de datos está oculto, pero se lo denomina "esto".
Los métodos para su clase pueden extenderse por toda la base de código. Debido a las clases para padres, ni siquiera es probable que encuentre estos métodos adyacentes entre sí.
Como todos los demás ya han dicho, no es posible tener un puntero a una clase.
Pero si el punto es crear una instancia nueva de alguna clase elegida en tiempo de ejecución, es posible que desee comprobar los patrones de diseño de Método de fábrica (o Fábrica abstracta).
No puede tener un puntero (en tiempo de ejecución) para una clase, pero C++ tiene un concepto de tiempo de compilación similar: template parameters. Boost tiene un library dedicado a manipularlos y una biblioteca traits para obtener información acerca de las clases.
Dependiendo de cómo quiera pensar en los punteros, puede tener un "puntero" a una clase, si por puntero quiere decir algún valor integral. Boost le permite registrar tipos y asignar un número entero único para cada tipo que registre.Si los tipos que está registrando son todas las clases, puede buscar en el tiempo de ejecución el código necesario para crear un objeto del tipo que desee, siempre que tenga el valor del tipo que desee. Pero, en general, las clases no son objetos de primera clase en el idioma y lo mejor que puede esperar es simular el comportamiento que desea tener.
Cierto, no hay soporte para la reflexión/introspección en C++, pero hay una serie de bibliotecas que agregarán muchas de, por ejemplo, la funcionalidad Class de Java, y permitirán que un programador obtenga un objeto que represente una clase, crear una instancia, etc. google C++ reflexión.
- 1. ¿Por qué tener un puntero a un puntero (int ** a)?
- 2. ¿Se puede llamar a una función estática a través de un puntero de función en C?
- 3. ¿Cómo es que un puntero a una clase derivada no se puede pasar a una función esperando una referencia a un puntero a la clase base?
- 4. C++ borrar un puntero a un puntero
- 5. Sintaxis para un puntero a una función que devuelve un puntero de función en C
- 6. Un puntero a una función encuadernada solo se puede usar para llamar a la función
- 7. Tener una función de cambiar el valor de un puntero representa en C
- 8. ¿Es una mala práctica para un objeto secundario tener un puntero a su elemento primario?
- 9. ¿C++ 11 std :: function limita el número de argumentos que puede tener un puntero a la función?
- 10. Puntero a un puntero en objetivo-c?
- 11. ¿Cómo declaras un puntero a una función que devuelve un puntero a una matriz de valores int en C/C++?
- 12. ¿Puede un elemento tener una identificación y una clase?
- 13. ¿Cómo paso un puntero a una función c en Cython?
- 14. ¿Por qué un puntero a un puntero es incompatible con un puntero a una matriz?
- 15. C: puntero a función en línea
- 16. puntero a un puntero
- 17. ¿Cómo se puede clonar una clase C++ derivada a través de un puntero base?
- 18. Volver puntero de clase a partir de una función
- 19. ¿Puede una URL tener un asterisco?
- 20. Pasar la función puntero a miembro como puntero a función
- 21. C: ¿Cómo pasar un doble puntero a una función
- 22. Devolver un puntero a una variable automática
- 23. ¿Puede un archivo Java tener más de una clase?
- 24. C++ miembro de la clase puntero a la función global
- 25. no se puede pasar un puntero a una función entre las clases
- 26. Puntero de función que apunta a una función que toma un puntero de función
- 27. Para pasar un puntero a una función miembro
- 28. ¿Puede gdb hacer que un puntero a otra posición funcione?
- 29. Crear un puntero a la función que toma un puntero a la función como argumento
- 30. puntero constante frente a un puntero en un valor constante
Si fuera posible, y no lo es, ¿de qué serviría un puntero a una clase? –
@Jim Buck: pasándolo por alto, usándolo para crear instancias nuevas de la clase, descubriendo sus miembros y todas las otras cosas divertidas que haces en Java con java.lang.Class. – CesarB
Ahh, sí, necesitaría una reflexión que tampoco está presente en C++. –