[eside-ghost] C++, factorias con clases autoregistrantes

Jon Valdés juanval en gmail.com
Jue Oct 2 09:58:28 CEST 2008


2008/10/2 Arkaitz <arkaitzj en gmail.com>:
> Buenas,
>
> Estaba mirando alguna manera de auto registrar clases con alguna estructura
> determinada. No hay muchas restricciones en un lado ni en el otro, la clave
> es que tenga una base (un main) con todo lo principal, la factory, algunas
> clases que sirven y tal. Esto lo tienes en un .o
> Luego te creas otra clase valida y la compilas en su .o, la movida es poder
> utilizar esta clase desde el main despues de linkarla sin modificar el main
> claro.
>
> Puedo imaginarmelo con solo una clase adicional, se utiliza un puntero en
> memoria estatica y cuando la clase nueva es linkada al ejecutarla inicializa
> el puntero a una funcion estatica que devuelve un objeto de esa clase. Hasta
> ahi bien, podria linkar cualquier objeto que contenga esas clases siempre y
> cuando recuerde inicializar el puntero a esa funcion en conreto.
>
> Sin embargo si quiero que funcione para mas de 1 clase extra no veo la
> manera. No puedo utilizar un array estatico porque las clases no sabrian en
> que posicion registrarse cada una y no pueden preguntar nada porque lo unico
> que se hace es inicializacion estatica, no se ejecuta nada.
>
> En fin, que me tiene muy mosca esto, alguna idea alguien?

Yo estoy haciendo algo así para un sistema de plugins, y lo que ando
haciendo es tener un stl::map<string, HMODULE>, que guarda la relación
de "nombre de plugin" con "librería dinámica cargada".

Luego todos los plugins tienen una función estática que se llama
igual, y que funciona como factoría para ese plugin.

Bueno, en realidad tengo varias clases de plugins (GUI, datos, etc),
pero puede haber varios de cada tipo cargados en un solo momento.

Al final creo que no lo utilizaré en el programa que estoy haciendo,
porque un programa en el que el 90% de la funcionalidad está en forma
de plugin creo que es un tanto excesivo... pero el código está ya
hecho y tira bien.

Si quieres echarle un vistazo, aquí está el código de carga de plugins y tal...
http://hombrealto.com/hg/ViBos/file/9678e3b7182c/src/plugengine/
Y aquí varios plugins de prueba que estuve haciendo:
http://hombrealto.com/hg/ViBos/file/9678e3b7182c/src/plugins/

No garantizo que funcione a la perfección, pero las pruebas que he ido
haciendo parecen tirar majamente.

A ver si te sirve :)

Taluegooo


Más información sobre la lista de distribución eside-ghost