Несколько экземпляров статического синглтона - PullRequest
2 голосов
/ 30 марта 2010

Я недавно работал с кодом, который выглядит следующим образом:

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

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

1 Ответ

4 голосов
/ 30 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...