请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

有关单例模式的疑惑

老师好!在学习过本节课程后,我有一些思考以及疑惑。

疑惑一:为何必须在全局范围内声明静态非常量属性,而在声明之前GetInstance()函数不能使用它,即便是加上域运算符::也依然不能使用?

思考:在C++中,声明、定义、初始化是三个不同的概念,声明是定义的前提,定义是使用(包括初始化)的前提;对于静态非常量属性,声明与定义是分离的(类似于C语言中用extern修饰的变量),而这种现象并不常见(通常,我们在全局范围或者函数作用域内声明一个整形变量,即便不对它进行赋值,它也依然完成了定义操作,能够被使用,即声明包含了定义过程)。

疑惑二:假如GetInstance返回的类型是const类型,那么单例模式下,属性该如何更改?

思考:或许需要有一种方法,获得非const类型的对象,否则其内部属性将永远无法更改。

请老师进行批评指正。

正在回答 回答被采纳积分+3

1回答

quickzhao 2023-06-30 09:24:20

问题一静态非常量属性的声明和定义在类的内部是不够的,因为在类内部只是定义了该属性的存在,并没有为其分配内存空间。将静态非常量属性的声明放在全局范围内,使得该属性可以在整个程序中可见。这样一来,在单例模式中,通过定义一个静态成员变量来表示单例实例,可以保证该实例的唯一性。全局范围的声明确保了该静态成员变量在整个程序中只有一个实例,并且可以在需要的地方进行访问。

问题二只需要在非const方法里面更改其属性就可以了,当获取单例后调用非const方法就可以。

0 回复 有任何疑惑可以回复我~
  • 提问者 Edot #1
    老师,对于问题二我实际测试下来,调用非const方法会直接报错,并且如果想把返回值赋值给非const指针也会报错,可能和编译器有关。
    回复 有任何疑惑可以回复我~ 2023-06-30 10:40:22
  • quickzhao 回复 提问者 Edot #2
    这里调用的方法必须是static的,不可是对象的非static方法。
    回复 有任何疑惑可以回复我~ 2023-06-30 11:23:39

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信