Несколько экземпляров статического синглтона
Вопрос
Недавно я работал с кодом, который выглядит следующим образом:
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.Почему это?
Решение
Первая строка Test::Test создает еще один экземпляр Singleton (в стеке ваш локальный файл не является ссылкой).Вы можете предотвратить это, определив конструктор по умолчанию в Singleton и сделав его закрытым.В нынешнем виде любой может создать экземпляр Singleton.
Не связан с StackOverflow