class A {
private:
A instancia=null;
A();
public:
static A getInstancia();
};
A A::getInstancia() {
if(instancia == null) return new A();
else return instancia;
}
Francamente, me gustaría saber si alguno de vosotros ha compilado ese fragmento de código, porque según veo ha de dar errores de todo tipo por todas partes. Además, si consiguieras hacer eso funcionar generarías una nueva instancia en cada llamada a getInstancia().
Una forma correcta de hacer eso (que se llama singleton) y bastante probada es hacer esto:
// En el fichero .h
class A
{
public:
// Métodos que hagan falta
// ...
~A() { /* código destructor */}
// Retorna la única instancia de la clase
static A *Instancia() {return &m_A;};
private:
static A m_A;
A() { /* código constructor */ };
// El constructor de copias tambien debe
// ser privado
A(const A &);
// Otros miembros privados
// ...
};
// En el fichero .cpp
// Para dar presencia física a la variable
// estática
A A::m_a;
// Implementar aqui el resto de métodos de la clase
De esta forma, para acceder a la instancia se podría hacer esto en el código:
A::Instancia()->método1();
o también
A *pA = A::Instancia();
pA->método1();
pA->método2();
Hay que tener en cuenta que no hay que liberar los punteros, ya que apuntan a m_A, que será automáticamente liberado cuando sea llamado el destructor de la clase.
Esto tiene el problema del orden de inicialización si se llaman entre sí varias clases de este tipo en los constructores, pero se puede arreglar moviendo m_A al interior de Instancia() en forma de variable estática, por lo que será inicializado en la primera llamada a Instancia().
Creo que no he cometido ningún error en el código. Si no es así que alguien me lo diga.
Espero que esto te haya servido de ayuda.
Un saludo.
Ruben3D