2010-04-25 14 views
5

Tengo un programa en C++ con complementos (bibliotecas dinámicas). En el programa principal, quiero ejecutar una función estática para verificar si puedo crear un objeto de este tipo.Fuerza para volver a implementar una función estática en las clases heredadas

Un ejemplo sin bibliotecas dinámicas (no son NECESARIO para entender el problema):

#include "libs/parent.h" 
#include "libs/one.h" 
#include "libs/two.h" 

int main(int argc, char * argv[]) 
{ 
    Parent* obj; 

    if (One::match(argv[1])) 
     obj = new One(); 
    else if (Two::match(argv[1])) 
     obj = new Two(); 
} 

Ahora, tengo una llamada de Padres clase de interfaz. Todos los complementos heredan de esta clase. Idealmente, tengo una función estática virtual en Parent named match, y todos los complementos necesitan volver a implementar esta función.

El problema con este código es que no puedo hacer una función virtual estática en C++, por lo que no sé cómo resolver el problema.

Lo siento por mi Inglés, hice todo lo posible

+0

Si la función 'match()' es estática, ¿no la llamaría 'One :: match()'? ¿Por qué tiene que ser estático? –

+0

Lo siento, he corregido el error Tiene que ser estático porque necesito llamarlo antes de crear el objeto – pacopepe222

+0

Sin preocupaciones, creo que usar un método virtual puro funcionaría para usted, pero eso no es estático. Entonces quizás las respuestas de otros puedan ayudarlo más. –

Respuesta

5

Lo que tenemos aquí es un clásico fábrica patrón. Desea crear una interfaz llamada IPluginFactory que tenga dos métodos: match y create (u, opcionalmente, combinarlos en un solo método). Entonces, cada uno de tus archivos DLL de complemento tendría una clase que implementa esta interfaz.

Parent obj; 
    IPluginFactory *one = new OneFactory(); 
    IPluginFactory *two = new TwoFactory(); 

    if (one->match(argv[1])) 
     obj = one->createObj(); 
    else if (two->match(argv[1])) 
     obj = two->createObj(); 
+1

Esta respuesta no aborda las funciones 'virtuales estáticas'. –

+0

Sin embargo, aborda la cuestión. –

+0

No veo cómo esto se relaciona con las funciones estáticas. ¿Puedes iluminarme? –

1

Se podría añadir un poco de static string a cada uno de sus complementos, que mantendría su nombre. O bien, haga una estructura llamada PluginID y agregue este string a esta estructura (y probablemente algo más específico del complemento).

Ahora igualar en tiempo de ejecución parece ser muy simple. Simplemente verifique si esa cadena de identificación estática de su complemento coincide con su argv.

Esta es una implementación comúnmente utilizada de un llamado "su-propio-y-simple-rtti", supongo que resolvería sus problemas.

+0

Los métodos 'match' no necesariamente comprueban la igualdad simple. –

+0

Estoy de acuerdo en que crear una fábrica de objetos sería una mejor solución, pero mi intuición en realidad dice que esta simple implementación rtti es lo que funcionaría en este caso particular –

+0

El problema es que el método match() es más complicado que la simple comparación de la cuerda pasada por argv, ¡pero gracias! – pacopepe222

Cuestiones relacionadas