关于只能有一个对象的类的定义和使用。

yumangmang 2008-04-22 09:17:08
最近学习《C++ primer plus》的时候,书中简单介绍了一个“单元素模型”,当时没有看懂,但是因为加上代码只有半页的篇幅,觉得应该不是什么特别重要的东西,就跳过去了,但是后来看到论坛上有位仁兄发了一个公司面试的考试题,其中有一个就是要你写一个这样的类。所以我就想,大概这是个比较重要的常用的内容吧,于是中心回过头来看这个东西,但是反复看了很多遍,还是难以透彻理解,只有点滴的认识(就是写在注释里面的),还希望大家能够帮我理解一些,到底是什么意思?如果打字麻烦,能给个这个方面的链接也万分感谢。
为了看起来方便,我把书里的代码简化了(就是把所有名字都弄短了一点儿而已,我自己现在看20个字母以上的类名字眼晕),如下:

class OnlyYou
{
public:
static OnlyYou* GetYou(); //这个函数是创建OnlyYou对象的唯一方法......嗯?
//othe methods
protected:
OnlyYou(){} //因为构造函数是保护状态,所以不能按照常规的方式声明一个OnlyYou对象......对否?
private:
//private data
};

OnlyYou* OnlyYou::GetYou() //函数的返回值是OnlyYou对象的地址。
{
static OnlyYou You; //它就是创建静态OnlyYou对象,而且仅仅是一个......是静态对象又咋啦?有啥牛的?
return &You;
}
...全文
174 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjy1204 2008-04-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 yumangmang 的帖子:]
static OnlyYou You; //它就是创建静态OnlyYou对象,而且仅仅是一个......是静态对象又咋啦?有啥牛的?
[/Quote]

不是他有啥牛的,
而是你想用这个类的对象时,只能

OnlyYou * pObj = OnlyYou::GetYou(); //返回的始终都是static OnlyYou You这个静态对象的指针,你只能使用这个指针去执行这个类的操作


所以就达到了只能有一个对象的目的

至于为什么有这样的需求,见2楼,或者去google..
yumangmang 2008-04-22
  • 打赏
  • 举报
回复
也许是我对 “静态模式”“堆栈”之类的管理方面的东西理解还很有限吧。
fibbery 2008-04-22
  • 打赏
  • 举报
回复
static OnlyYou You; //它就是创建静态OnlyYou对象,而且仅仅是一个......是静态对象又咋啦?有啥牛的?

静态对象只构造一次,所以比局部变量“牛”,由于GetYou是OnlyYou的成员函数,所以可以调用OnlyYou的构造函数,单元素模式的代码,我觉得挺优美的。
overbai 2008-04-22
  • 打赏
  • 举报
回复
class OnlyYou
{
public:
static OnlyYou* GetYou(); //这个函数是创建OnlyYou对象的唯一方法......嗯?
//othe methods
protected:
OnlyYou(){} //因为构造函数是保护状态,所以不能按照常规的方式声明一个OnlyYou对象......否?
private:
//private data
};

OnlyYou* OnlyYou::GetYou() //函数的返回值是OnlyYou对象的地址。
{
static OnlyYou You; //它就是创建静态OnlyYou对象,而且仅仅是一个......是静态对象又咋啦?有啥的?
return &You;
}

本人拙见:
static成员是属于类本身的,并不属于任何一个对象且只有一个副本,所以用static限制!
其次,构造函数是受保护的,这样外部就无法通过有构造函数来生成对象!即只能使用GetYou()来生成对象,但它又是静态的
所以只能生成一个对象!(可以看一下书中对static成员的解释)
yumangmang 2008-04-22
  • 打赏
  • 举报
回复
几位的回复让我对这个Singleton模式的重要性有了更好的认识,非常感谢,不过我还是不太面白那些代码的逻辑......
csdn5211 2008-04-22
  • 打赏
  • 举报
回复
静态对象不在栈上啊,而且不用使用delete释放。
看看设计模式的书里,这个叫单例模式。
Treazy 2008-04-22
  • 打赏
  • 举报
回复
就是Singleton模式

个人认为Singleton模式是设计模式中最为简单、最为常见、最容易实现,也是最应该熟悉和掌握的模式。且不说公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是Singleton模式。
Singleton模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过Singleton模式来实现了,可能这也正是很多公司在招聘Java开发人员时候经常考察Singleton模式的缘故吧。
taodm 2008-04-22
  • 打赏
  • 举报
回复
google singleton模式
内容概要:本文围绕【Koopman降阶非线性辨识与控制】开展研究,聚焦于数据驱动(Data-driven)框架下库普曼(Koopman)控制特征函数的分析与实现,提出一种基于Matlab的简化版代码实现方法。该研究通过构建简化的Koopman算子模型,对非线性系统进行线性化降阶处理,从而实现对复杂系统动态行为的有效辨识与控制。文中详细阐述了Koopman谱分析、动态模态分解(DMD)等核心理论在控制中的应用,结合具体Matlab代码演示了特征函数的提取流程与控制策略的设计,强调算法的可复现性与工程实用性。研究不仅适用于非线性系统建模,也为高维复杂系统的实时控制提供了轻量化解决方案。; 适合人群:具备一定非线性系统控制、现代控制理论基础和Matlab编程能力的研究生、科研人员及自动化、航空航天、机器人等领域的工程技术人员。; 使用场景及目标:① 学习并掌握数据驱动的Koopman控制理论及其在非线性系统降阶中的应用;② 通过提供的Matlab代码实现,复现并验证Koopman特征函数的提取与控制效果,加深对降阶模型的理解;③ 将该方法应用于如机器人控制、飞行器姿态调整、能源系统调度等存在复杂非线性的实际场景中,以实现高效、稳定的控制。; 阅读建议:此资源侧重于理论与代码实现的紧密结合,建议读者在学习时首先理解Koopman算子的基本思想,然后对照Matlab代码逐行分析其实现逻辑,重点关注数据预处理、算子构造、特征值求解等关键步骤。同时,应结合实际应用场景,尝试修改参数或测试不同数据,以充分把握该方法的优势与局限性。

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧