静态单例的多个实例

时间:2010-03-29 22:31:46

标签: c++ singleton

我最近一直在使用看起来像这样的代码:

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 个答案:

答案 0 :(得分:4)

Test :: Test的第一行创建了Singleton的另一个实例(在堆栈上,你的本地不是引用)。您可以通过在Singleton上定义默认构造函数并将其设置为私有来防止这种情况。就目前而言,任何人都可以创建一个Singleton实例。