[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