我最近一直在使用看起来像这样的代码:
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实例。这是为什么?
答案 0 :(得分:4)
Test :: Test的第一行创建了Singleton的另一个实例(在堆栈上,你的本地不是引用)。您可以通过在Singleton上定义默认构造函数并将其设置为私有来防止这种情况。就目前而言,任何人都可以创建一个Singleton实例。