比如说一个类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()
都会通不过编译,前者是因为语法就有问题,后者是因为操作符=被禁止在外部使用...
所以想请问一下这个情况该怎么处理.
谢谢!
哎..其实很简单..说一下我个人的理解
extern only &o;
只是一个声明
因此将此声明写入一个头文件中,然后确保项目中的每个单元都加载了这个头文件(本质是确保这个声明该变量为全局变量的声明被每个单元都知晓)之后再定义.
only &o = only::getInstance(); /* extern only &o和only &o不会冲突,我的理解是一个声明,一个是定义 */
但定义时要注意: 1)不能定义在{}中,否则即使声明了全局变量,但其它函数仍不知道给o什么定义 2)定义只能定义一次,o=blabla这样可以,但是only &o只能出现一次
1
iceheart 2018-11-22 19:22:17 +08:00 via Android
你的那个 getInstance() 应该定义为静态的。
=号被禁止,是因为单例只能有一个对象,所以不应该以赋值的方式初始化新对象。这个是 private 区的那个 operator=声明禁掉的。 |
2
Newyorkcity OP @iceheart 啊..抱歉,写问题的时候没注意到,我实际程序里确实是静态的,但还是运行不起来
就是应该是 static only& getInstance(){static only onlyoneinstance; return onlyoneinstance} 这样写还是会碰上这个问题 |
3
across 2018-11-22 19:38:57 +08:00 via iPhone
声明成类内静态成员变量。
GetInstance 也是静态的。 这个例子很多,搜一下就能找到一堆代码。 |
4
Newyorkcity OP @across
声明成类内的静态成员变量什么意思?我再建一个类,然后这个类里面静态声明一个 only 变量?好像可行诶... getInstance 这个是我些问题的时候没仔细,我实际程序里加了 static 的,可见二楼 谢谢 |
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; } //手机撸一个拿去 |
6
Jzdoxc 2018-11-23 10:30:19 +08:00
第一个式子能理解,加&是引用 get 出来的对象
第二个式子不是很理解,这样实例化应该是会调用复制构造函数,但是复制构造函数被私有化,那这时候它这个等号起什么作用?拷贝一份 getInstance()的副本给 onlyInstance 吗? |