我最近一直在与代码看起来像这样:

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的另一个实例(在栈中,本地不是参考)。你可以通过定义辛格尔顿默认的构造函数,并使其私人防止这一点。既然这样,任何人都可以创建单例的一个实例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top