Pregunta

Recientemente he estado trabajando con el código que es similar al siguiente:

using namespace std;

class Singleton {
    public:
        static Singleton& getInstance();
        int val;
};

Singleton &Singleton::getInstance() {
    static Singleton s;
    return s;
}

class Test {
    public:
        Test(Singleton &singleton1);
};

Test::Test(Singleton &singleton1) {
    Singleton singleton2 = Singleton::getInstance();
    singleton2.val = 1;
    if(singleton1.val == singleton2.val) {
        cout << "Match\n";
    } else {
        cout << "No Match " << singleton1.val << " - " << singleton2.val << "\n";
    }   
}

int main() {
    Singleton singleton = Singleton::getInstance();
    singleton.val = 2;
    Test t(singleton);
}

Cada vez que lo ejecuto me sale "No Match". Sin embargo, yo estoy esperando un partido ya que no sólo debe ser una instancia de la clase. De lo que puedo decir al desplazarse por la GDB es que hay dos instancias del Singleton. ¿Por qué es esto?

¿Fue útil?

Solución

La primera línea de Test :: Prueba crea otra instancia de Singleton (en la pila, el local no es una referencia). Se podría evitar esto definiendo el constructor por defecto en Singleton y lo que es privado. En la actualidad, cualquiera puede crear una instancia de Singleton.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top