Frage

Ich habe mit Code vor kurzem gearbeitet, das sieht wie folgt aus:

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

Jedes Mal, wenn ich es betreibe ich „No Match“ erhalten. Dennoch erwarte ich ein Spiel, da es nur eine Instanz der Klasse sein sollte. Von dem, was ich kann sagen, wann mit GDB Schreiten durch ist, dass es zwei Instanzen der Singleton. Warum ist das?

War es hilfreich?

Lösung

Die erste Zeile des Test :: Testens schafft eine andere Instanz von Singleton (auf dem Stack, die lokalen keine Referenz ist). Sie können dies verhindern, indem der Standard-Konstruktor auf Singleton definieren, und es privat machen. Wie es aussieht, kann jemand eine Instanz von Singleton erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top