Question

J'ai récemment travaillé avec le code qui ressemble à ceci:

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

Chaque fois que je le lance je reçois « Pas de match ». Pourtant, je me attends à un match car il ne devrait y avoir une instance de la classe. D'après ce que je peux dire quand marcher jusqu'au bout GDB est qu'il ya deux instances du Singleton. Pourquoi est-ce?

Était-ce utile?

La solution

La première ligne de test :: test crée une autre instance de Singleton (sur la pile, votre local n'est pas une référence). Vous pouvez éviter cela en définissant le constructeur par défaut sur Singleton et le rendre privé. En l'état actuel, tout le monde peut créer une instance de Singleton.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top