在全局空间中访问的私有静态对象

时间:2013-11-11 06:23:26

标签: c++ static singleton

Singleton怀疑:我如何能够访问全局空间中的私有静态对象?代码如下。这完全没问题。


#include <iostream>
using namespace std;

class Singleton {
    static Singleton s;
    static void func()
    {
        cout<<"i am static function "<<endl;
    }
    int i;
    Singleton(int x) : i(x) {
    cout<<"inside Constructor"<<endl;
    }
    void operator=(Singleton&);
    Singleton(const Singleton&);
    public:

    static Singleton& getHandle() {
        return s;
    }
    int getValue() { return i; }
    void setValue(int x) { i = x; }
};

Singleton Singleton::s(47);


int main() {

    Singleton& s = Singleton::getHandle();
    cout << s.getValue() << endl;
    Singleton& s2 = Singleton::getHandle();
    s2.setValue(9);
    cout << s.getValue() << endl;
}

2 个答案:

答案 0 :(得分:1)

你做不到。无论上下文如何,私人成员都是私人成员。除了课堂内外,您无法从任何地方访问它们。

您正在做的事情实际上并不是直接访问私有成员 ,您使用公共函数返回对它的引用然后可以使用它。 main函数中的代码不会访问私有成员m

答案 1 :(得分:1)

我没有看到Singleton以外的任何内容访问私有静态变量s

在main中,您引用了一个单例,恰好被命名为s ,但这不是直接访问私有静态变量Singleton::s。您的方法Singleton::getHandle会返回对Singleton::s的引用,该引用恰好绑定到main中的s,但正如您演示的那样,您可以将其绑定到s以外的其他内容,比如s2

该行

Singleton Singleton::s(47);

正在定义(以及初始化)Singleton::s,但如果您尝试在main中引用Singleton::s,则会出现预期的错误。