[C con Clase] Buenas tardes a todos. En relación a patrón Singleton en C++. Pregunta compleja.
Miguel Ángel Torres Fernández-Píñar
miguelangeltorresfp en gmail.com
Lun Jul 14 04:07:27 CEST 2014
Muchas gracias Steven, ya veo que sigues al pie del cañón como siempre.
Al final he usado este modelo aunque estuve pensando en usar punteros
inteligentes ( uso la librería de mi profe que tiene incorporada una clase
para manejar punteros inteligentes ).
class SingletonManagers
{
public:
static SingletonManagers& getInstance()
{
static SingletonManagers instance;
return instance;
}
private:
SingletonManagers() {}
SingletonManagers(SingletonManagers const&);// Don't Implement.
void operator=(SingletonManagers const&);// Don't implement
public:
//Referencia al manager principal
App_Main_Manager* app_main_manager;
};
Es otra alternativa que recomiendan por ahí para solucionar estos problemas.
Aunque realmente el problema lo tenía principalmente para poder guardar una
referencia a la clase "App_Main_manager".
Es que esta clase implementa un loop. Al cerrar de manera forzada la
aplicación invoca un método propio "halt()", y ahí, en ese método, tuve que
poner :
//Se invoca cuando se interrumpe la aplicación bruscamente
void App_Main_Manager::halt()
{
cout << "halt" << endl;
SingletonManagers::getInstance().app_main_manager = null;
}
Y con eso ya se puede cerrar la aplicación sin que de problemas.
Ah, Steven, no entendí muy bien lo de :
virtual ~SingletonManagers(){};
Pensé que era un destructor por el simbolito que tiene delante.
Gracias por vuestra ayuda.
El 13 de julio de 2014, 20:23, Davidson, Steven <srd4121 en njit.edu> escribió:
> Hola Miguel Ángel,
>
> 2014-07-13 6:13 GMT-04:00 Miguel Ángel Torres Fernández-Píñar <
> miguelangeltorresfp en gmail.com>:
>
> Muchas gracias Borja por tu respuesta. Sé que estos son temas complejos y
>> mi nivel de C++ es bastante bajo.
>>
>> Parece que ya funciona.
>>
>> Hay una cosa que no entiendo en el ejemplo de
>> http://caymcorp.wordpress.com/2010/09/28/singletons-en-c-el-problema-de-la-destruccion/
>>
>> Para qué se usa esto :
>>
>> public:
>> virtual ~SingletonManagers(){};
>>
>>
> Esto sirve para crear una clase virtual, de la que se puede derivar y así
> usar objetos polimórficos de la clase base, 'Singleton'.
>
> Se supone que el destructor que se llama automáticamente con :
>> atexit(&DestroySingleton); // At exit, destroy the singleton
>>
>>
> Sí, pero 'DestroySingleton()' invocará implícitamente a su destructor,
> '~Singleton()'.
>
> es :
>>
>> // Delete the singleton instance
>> static void DestroySingleton()
>> {
>> if(pInstance_ != NULL) delete pInstance_;
>>
>
> Aquí se invocará al destructor, '~Singleton()'.
>
> }
>>
>>
> Debo agregar que el uso de 'atexit()' puede ser peligroso para este tipo
> de problemas, ya que no garantiza el orden correcto de la destrucción de
> los objetos. En el código que usas, se invoca 'atexit()' dentro de
> 'getInstance()' para asegurar que se registre primero la función de
> destrucción.
>
> De todas maneras, sugiero usar punteros inteligentes. En la versión actual
> de C++, que a veces se llama C++11, puedes usar la plantilla-clase,
> 'shared_ptr', si quieres permitir el compartir entre punteros, o
> 'unique_ptr', si no quieres permitirlo. De esta manera, usas un objeto que
> contiene el puntero al objeto 'Singleton', por lo que al destruirse tal
> objeto, se invocará su destructor.
>
> La idea tras los punteros inteligentes es usar un objeto que contiene el
> puntero y no tener que manipular punteros directamente. Así reducimos la
> probabilidad de provocar fugas de memoria al usar punteros directamente.
>
>
> Espero que esto te oriente.
>
> Steven
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140714/c94b9340/attachment.html>
Más información sobre la lista de distribución Cconclase