tipos resueltos programas principiantes para ejercicios ejemplos descargar datos comandos codigo clases basicos avanzados c++ class runtime

resueltos - Conocimiento de tiempo de ejecución C++ de clases



programas en c++ ejemplos avanzados (7)

Tengo varias clases que todas derivan de una clase base, ahora algunas de las clases derivadas no se compilarán según la plataforma. Tengo una clase que me permite devolver un objeto de la clase base, sin embargo ahora todos los nombres de las clases derivadas han sido codificados.

¿Existe alguna manera de determinar qué clases se han compilado, preferiblemente en tiempo de ejecución, para poder eliminar el enlace y, en su lugar, proporcionar bibliotecas cargables dinámicamente?


¿Estás buscando el registro de la clase de tiempo de ejecución de C ++? Encontré este enlace: http://meat.net/2006/03/cpp-runtime-class-registration/

Probablemente eso logre lo que desea, no estoy seguro acerca de los módulos cargados dinámicamente y si puede o no registrarlos utilizando el mismo método.


Esto suena como un lugar para usar "polimorfismo de tiempo de compilación" o parámetros de política de plantilla.

Vea Diseño moderno en C ++ de Andrei Alexandrescu y su implementación de Loki basada en el libro. Ver también la página de Loki en wikipedia.


Generalmente, confiar en la información del tipo de tiempo de ejecución es una mala idea en C ++. Lo que has descrito parece ser el patrón de fábrica. Es posible que desee considerar la creación de una subclase de fábrica especial para cada plataforma, que solo sabrá sobre las clases que existen en esa plataforma.


Hay trucos desagradables, específicos del compilador para obtener información sobre la clase en tiempo de ejecución. Créeme, no quieres abrir esa lata de gusanos.

Me parece que la única manera seria de hacer esto sería usar compilación condicional en cada una de las clases derivadas. Dentro del bloque #ifdef, defina una nueva constante que contenga el nombre de clase que se está compilando. Luego, los nombres siguen codificados, pero todos en una ubicación central.


Los nombres de las clases derivadas tienen que estar codificados en C ++. No hay otra manera de usarlos. Por lo tanto, no solo no hay manera de detectar automáticamente qué clases se han compilado, no habría forma de utilizar esa información, si es que existía.

Si pudiera especificar clases en tiempo de ejecución en función de su nombre, algo como:

std :: string foo = "Derived1"; Base * object = new "foo"; // o cualquier notación que te guste, no funciona en C ++

entonces la capacidad de decir si "Derived1" fue compilado o no sería útil. Como debe especificar la clase directamente, como:

Base * object = new Derived1; // funciona en C ++

todas las comprobaciones se realizan en tiempo de compilación.


No sé qué es lo que realmente está intentando lograr, pero podría poner un constructor singleton en el archivo de implementación de cada clase derivada que agregue el nombre a una lista, junto con un puntero a una fábrica. Entonces la lista está siempre actualizada y puede crear todas las compiladas en clases.


Si cada clase tiene su propia biblioteca dinámica, simplemente verifique si existe la biblioteca.