题
我最近一直在与代码看起来像这样:
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的另一个实例(在栈中,本地不是参考)。你可以通过定义辛格尔顿默认的构造函数,并使其私人防止这一点。既然这样,任何人都可以创建单例的一个实例。
不隶属于 StackOverflow