V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

c++ 请问单例该如何和全局变量结合?

  •  
  •   Newyorkcity · 2018-11-22 19:11:16 +08:00 · 1827 次点击
    这是一个创建于 2188 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如说一个类only是单例模式的,那么:

    private:
        only(){}; //私有化它的构造器
        only(const only&){};  //私有化它的复制功能,不允许外部复制它
        only &operator=(const &only){};  //重载操作符=,不允许外部使用它
    public:
        only &getInstance(){/* 这里具体的就不写了 */};  
    

    这样外部要实例化一个 only 类时,有且只有通过only &onlyInstance = only::getInstance();了...其实我也不太明白为什么这里写only onlyInstance = only::getInstance();就会因为外部使用=操作符而报错,但加上&符号就能避免

    然后,如果一个类有且只有一个实例,那,整个程序用且只使用这一个实例,这个实例应该是很可能作为全局变量来使用的,我这个想法应该还算合理吧?

    可是如果要使用全局变量,在extern时不允许直接赋值,只能做到extern only &onlyInstance;

    可这样一来赋值操作就用了问题,不论是'&onlyInstance = only::getInstance()还是'onlyInstance = only::getInstance()都会通不过编译,前者是因为语法就有问题,后者是因为操作符=被禁止在外部使用...

    所以想请问一下这个情况该怎么处理.

    谢谢!

    第 1 条附言  ·  2018-11-22 22:12:06 +08:00

    哎..其实很简单..说一下我个人的理解

    extern only &o;
    

    只是一个声明

    因此将此声明写入一个头文件中,然后确保项目中的每个单元都加载了这个头文件(本质是确保这个声明该变量为全局变量的声明被每个单元都知晓)之后再定义.

    only &o = only::getInstance(); /* extern only &o和only &o不会冲突,我的理解是一个声明,一个是定义 */
    

    但定义时要注意: 1)不能定义在{}中,否则即使声明了全局变量,但其它函数仍不知道给o什么定义 2)定义只能定义一次,o=blabla这样可以,但是only &o只能出现一次

    6 条回复    2018-11-23 10:30:19 +08:00
    iceheart
        1
    iceheart  
       2018-11-22 19:22:17 +08:00 via Android
    你的那个 getInstance() 应该定义为静态的。

    =号被禁止,是因为单例只能有一个对象,所以不应该以赋值的方式初始化新对象。这个是 private 区的那个 operator=声明禁掉的。
    Newyorkcity
        2
    Newyorkcity  
    OP
       2018-11-22 19:29:45 +08:00
    @iceheart 啊..抱歉,写问题的时候没注意到,我实际程序里确实是静态的,但还是运行不起来
    就是应该是
    static only& getInstance(){static only onlyoneinstance; return onlyoneinstance}
    这样写还是会碰上这个问题
    across
        3
    across  
       2018-11-22 19:38:57 +08:00 via iPhone
    声明成类内静态成员变量。
    GetInstance 也是静态的。

    这个例子很多,搜一下就能找到一堆代码。
    Newyorkcity
        4
    Newyorkcity  
    OP
       2018-11-22 19:45:21 +08:00
    @across
    声明成类内的静态成员变量什么意思?我再建一个类,然后这个类里面静态声明一个 only 变量?好像可行诶...
    getInstance 这个是我些问题的时候没仔细,我实际程序里加了 static 的,可见二楼
    谢谢
    iceheart
        5
    iceheart  
       2018-11-22 21:55:13 +08:00 via Android
    class only {
    only(){}
    only(const only &);
    only & operator = (const only &);
    public:
    static only & get() {
    static only inst;
    return inst;
    }
    };
    only & g_ref = only::get();
    int main()
    {
    return 0;
    }
    //手机撸一个拿去
    Jzdoxc
        6
    Jzdoxc  
       2018-11-23 10:30:19 +08:00
    第一个式子能理解,加&是引用 get 出来的对象
    第二个式子不是很理解,这样实例化应该是会调用复制构造函数,但是复制构造函数被私有化,那这时候它这个等号起什么作用?拷贝一份 getInstance()的副本给 onlyInstance 吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1041 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:31 · PVG 06:31 · LAX 14:31 · JFK 17:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.