Pregunta

Tengo varias clases que derivan todas 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.

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

¿Fue útil?

Solución

¿Está buscando el registro de la clase de tiempo de ejecución de C++?encontré esto enlace (respaldo).

Eso probablemente lograría lo que desea, no estoy seguro acerca de los módulos cargados dinámicamente y si puede registrarlos usando el mismo método.

Otros consejos

No sé qué estás tratando de lograr realmente, pero podrías colocar 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 siempre estará actualizada y podrá crear todas las clases compiladas.

Generalmente, confiar en la información del tipo de tiempo de ejecución es una mala idea en C++.Lo que has descrito parece 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 conocerá las clases que existen en esa plataforma.

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

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

Existen trucos desagradables específicos del compilador para obtener información de clase en tiempo de ejecución.Créeme, no querrás abrir esa lata de gusanos.

Me parece que la única forma seria de hacerlo sería utilizar la compilación condicional en cada una de las clases derivadas.Dentro del bloque #ifdef, defina un nuevo Constante que contiene el nombre de la clase que se está compilando.Entonces, los nombres todavía están codificados, pero todos en una ubicación central.

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

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

std::string foo = "Derivado1";Base * objeto = nuevo "foo";// o cualquier notación que quieras - no funciona en C++

entonces sería útil tener la capacidad de saber si "Derived1" se compiló o no.Ya que tienes que especificar la clase directamente, como:

Base * objeto = nuevo Derivado1;// funciona en C++

toda la verificación se realiza en tiempo de compilación.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top