【问题标题】:private static object accessed in global space在全局空间中访问的私有静态对象
【发布时间】:2013-11-11 06:23:26
【问题描述】:

单身疑问:我如何能够访问全局空间中的私有静态对象?代码如下。这运行得很好。


#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;
}

【问题讨论】:

    标签: c++ static singleton


    【解决方案1】:

    除了Singleton 访问私有静态变量s 之外,我没有看到任何东西。

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

    线

    Singleton Singleton::s(47);
    

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

    【讨论】:

    • 这意味着我可以在全局空间中初始化静态私有对象??
    • @govindparihar,您实际上并不是在“[初始化]全局空间中的静态私有对象”。 Singleton Singleton::s(47); 行定义变量Singleton::s。也就是说,它表示Singleton::s 的存储位置并对其进行初始化。当有多个编译单元需要链接在一起时,这一点变得很重要。其中只有一个可以定义Singleton::s。您可能还想阅读What is the difference between a definition and a declaration?
    【解决方案2】:

    你不能。无论上下文如何,私有成员都是私有的。除了班级内部,您无法从任何地方访问它们。

    您所做的并不是真正访问私有成员直接,您使用公共函数返回对其的引用,然后可以使用该引用。 main函数中的代码没有访问私有成员m

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 2011-03-24
      • 1970-01-01
      相关资源
      最近更新 更多