Ver Mensaje Individual
  #4 (permalink)  
Antiguo 25/11/2015, 04:07
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Entendiendo el patrón Singleton.

Bueno, pues aquí va una implementación mejor (casi nada es mío):
Código C++:
Ver original
  1. #ifndef SINGLETON_H
  2. #define SINGLETON_H
  3.  
  4.  
  5. class Singleton
  6. {
  7.     public:
  8.         Singleton (const Singleton&) = delete;
  9.         Singleton& operator=(const Singleton&) = delete;
  10.         static Singleton& getInstance();
  11.         int VerValor();
  12.         void duplicar();
  13.         ~Singleton();
  14.  
  15.     private:
  16.         Singleton();
  17.         static Singleton* instancia;
  18.         int valor;
  19.  
  20. };
  21.  
  22. #endif // SINGLETON_H

Código C++:
Ver original
  1. #include "Singleton.h"
  2. #include <iostream>
  3.  
  4. Singleton::Singleton():valor(5){}
  5.  
  6. Singleton::~Singleton()
  7. {
  8.     std::cout<<"Borrando....";
  9. }
  10.  
  11. Singleton& Singleton::getInstance()
  12. {
  13.      static Singleton instancia;
  14.      return instancia;
  15. }
  16.  
  17. int Singleton::VerValor()
  18. {
  19.     return valor;
  20. }
  21.  
  22. void Singleton::duplicar()
  23. {
  24.     valor*=2;
  25. }

Código C++:
Ver original
  1. #include <iostream>
  2. #include "Singleton.h"
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.     Singleton& S = Singleton::getInstance();
  9.     Singleton& S2 = Singleton::getInstance();
  10.     S.duplicar();
  11.     cout<<S2.VerValor()<<endl;
  12.     return 0;
  13.  
  14. }

Por comentar las observaciones que he hecho....
Al principio no había hecho el uso de "delete" en los constructores de copia y asignación y he creado la instancia al modo "clásico"

Código C++:
Ver original
  1. Singleton S3(Singleton::getInstance());

Pero al ver el destructor me sonaba raro que se invocase 2 veces al mismo.
Luego he visto que lo suyo es prohibir estos constructores. A cambio, me obliga a crear la instancia como referencias.

Ahora, por la forma de ser creada la instancia, entiendo que no tiene sentido que se le pongan parámetros.

Lo que no entiendo muy bien es el por qué de este patrón. Es decir, en cierto modo estoy "enmascarando" que me remito siempre al mismo objeto, pero ese comportamiento lo puedo hacer igual con punteros, entiendo yo.
__________________
Mi calculadora en Qt