2010-03-29 6 views
2

Я недавно работал с кодом, который выглядит следующим образом:Несколько экземпляров статических 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); 
} 

Каждый раз, когда я запускаю его я получаю сообщение «No Match». Тем не менее, я ожидаю матча, так как должен быть только один экземпляр класса. Из того, что я могу сказать, когда переходить через GDB, есть два экземпляра Singleton. Почему это?

ответ

4

Первая строка Test :: Test создает еще один экземпляр Singleton (в стеке ваш локальный язык не является ссылкой). Это можно предотвратить, указав конструктор по умолчанию на Singleton и сделав его закрытым. Как бы то ни было, любой может создать экземпляр Singleton.

+2

На самом деле здесь вызывается конструктор копирования, поэтому вам также придется исправить это. –

+0

BillyONeal прав, вам также нужно скрыть конструктор копирования. –

Смежные вопросы