2008-11-13 15 views
7

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?

+0

Si fuera posible, y no lo es, ¿de qué serviría un puntero a una clase? –

+0

@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

+0

Ahh, sí, necesitaría una reflexión que tampoco está presente en C++. –

Respuesta

17

En C++, las clases no son "first class objects". Lo más cerca que puede obtener es un puntero a su instancia type_info.

5

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.

1

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.

+0

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

+0

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

1

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í.

+0

¿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? –

+0

Lo único que sé con certeza es Smalltalk. Java intenta hacerlo con getClass(), pero es inconsistente. – Arkadiy

+0

@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) –

1

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í.

4

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).

1

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.

0

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.

0

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.

Cuestiones relacionadas