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

2018-11-22 19:11:16 +08:00
 Newyorkcity

比如说一个类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()都会通不过编译,前者是因为语法就有问题,后者是因为操作符=被禁止在外部使用...

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

谢谢!

1827 次点击
所在节点    问与答
6 条回复
iceheart
2018-11-22 19:22:17 +08:00
你的那个 getInstance() 应该定义为静态的。

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

这个例子很多,搜一下就能找到一堆代码。
Newyorkcity
2018-11-22 19:45:21 +08:00
@across
声明成类内的静态成员变量什么意思?我再建一个类,然后这个类里面静态声明一个 only 变量?好像可行诶...
getInstance 这个是我些问题的时候没仔细,我实际程序里加了 static 的,可见二楼
谢谢
iceheart
2018-11-22 21:55:13 +08:00
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
2018-11-23 10:30:19 +08:00
第一个式子能理解,加&是引用 get 出来的对象
第二个式子不是很理解,这样实例化应该是会调用复制构造函数,但是复制构造函数被私有化,那这时候它这个等号起什么作用?拷贝一份 getInstance()的副本给 onlyInstance 吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/510505

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX