Domanda

Recentemente ho lavorato con il codice che assomiglia a questo:

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);
}

Ogni volta che l'eseguo ottengo "No Match". Eppure, mi aspetto un match da quando ci dovrebbe essere una sola istanza della classe. Da quello che posso dire quando si passa attraverso con GDB è che ci sono due istanze del Singleton. Perché questo?

È stato utile?

Soluzione

La prima linea di Test :: test crea un'altra istanza di Singleton (in pila, il vostro locale non è un punto di riferimento). Si potrebbe evitare questo con la definizione del costruttore di default su Singleton e renderlo privato. Così com'è, chiunque può creare un'istanza di Singleton.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top