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

Hola:

Ahora que tengo algo de tiempo, he retomado el C++ y en este caso iba a ver si profundizo en el tema de patrones. Para ello he empezado con el que se supone que es el más sencillo, el Singleton.

La implementación está casi fusilada de uno de los muchos ejemplos que hay en la red, pero cuando he querido hacer mis enredos han sido todo problemas.

Esta es la implementación:

Singleton.h
Código C++:
Ver original
  1. #ifndef SINGLETON_H
  2. #define SINGLETON_H
  3.  
  4.  
  5. class Singleton
  6. {
  7.     public:
  8.         static Singleton* getInstance();
  9.         virtual ~Singleton();
  10.         int VerValor();
  11.         void duplicar();
  12.  
  13.     protected:
  14.         Singleton();
  15.  
  16.     private:
  17.         static Singleton* instancia;
  18.         int valor;
  19.  
  20. };
  21.  
  22. #endif // SINGLETON_H

Singleton cpp
Código C++:
Ver original
  1. #include "Singleton.h"
  2. #include <iostream>
  3.  
  4. Singleton*::Singleton::instancia=nullptr;
  5.  
  6. Singleton::Singleton():valor(5){}
  7.  
  8. Singleton::~Singleton()
  9. {
  10.     std::cout<<"Borrando....";
  11.     delete instancia;
  12. }
  13.  
  14. Singleton*::Singleton::getInstance()
  15. {
  16.      if(instancia == nullptr)
  17.      {
  18.          instancia = new Singleton();
  19.          //valor=v;
  20.      }
  21.   return instancia;
  22. }
  23.  
  24. int Singleton::VerValor()
  25. {
  26.     return valor;
  27. }
  28.  
  29. void Singleton::duplicar()
  30. {
  31.     valor*=2;
  32. }

main.cpp
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;
  9.     S->getInstance();
  10.     cout<<S->VerValor();
  11.     delete S;
  12.     return 0;
  13.  
  14. }

Y las dudas son:

Si llamo a la función VerValor() obtengo error de segmentación, pero no entiendo el por qué.
Se supone que en la creación de la instancia, le doy un valor al miembro "valor". No sé por qué me da error al retornarlo,
Y cuando borro el puntero, no se me muestra el mensaje del destructor. ¿Y eso por que?

Y otra cosa:

Si quiero crear la instancia de la clase con algún argumento (no sé si se dará el caso en alguna aplicación práctica, pero bueno, por probar) lo intento así:

Código C++:
Ver original
  1. Singleton*::Singleton::getInstance(int v)
  2. {
  3.      if(instancia == nullptr)
  4.      {
  5.          instancia = new Singleton();
  6.          valor=v;
  7.      }
  8.   return instancia;
  9. }

Pero me da el error:
include/Singleton.h|18|error: invalid use of member ‘Singleton::valor’ in static member function|

Gracias como siempre
__________________
Mi calculadora en Qt