2010-03-29 5 views
2

J'ai récemment travaillé avec le code qui ressemble à ceci:plusieurs instances de statique Singleton

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, j'attends une correspondance car il ne devrait y avoir qu'une seule instance de la classe. D'après ce que je peux dire en passant par GDB, il y a deux instances du Singleton. Pourquoi est-ce?

Répondre

4

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 empêcher cela en définissant le constructeur par défaut sur Singleton et en le rendant privé. En l'état, n'importe qui peut créer une instance de Singleton.

+2

En fait, le constructeur de copie est appelé ici, donc vous devrez le réparer aussi. –

+0

BillyONeal a raison, vous devez également masquer le constructeur de copie. –