如何建立一个只能创建一个实例的类

smwu 2003-03-24 07:32:43
其实我觉得这个问题提得很模糊 如果我用
myclass my1;
myclass my2;//这个时候应该出错?出异常?还是my2==my1?
不知道哪位高人能给我一个比较好的回答?
...全文
81 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
smwu 2003-03-25
  • 打赏
  • 举报
回复
实际上我一开始也是这么想的 屏蔽普通的实例创建方式 采用内部外部的函数来实现一个classfactory的功能 但是这么做无疑是对这个singleton的使用做了比较大的限制的方法
是否可能在构造函数和类的结构上做文章 使得创建的第二个变量和第一个“实际上”是同一个?
skfox 2003-03-25
  • 打赏
  • 举报
回复
你们看看候捷翻译的More Effictive C++就知道了,里面有现成的例子,我上机运行OK
VCnst2 2003-03-25
  • 打赏
  • 举报
回复
好像mfc中用了互斥量解决
shornmao 2003-03-25
  • 打赏
  • 举报
回复
请看<<design pattern>>中的单件(Singleton)模式,上面写的代码或多或少都有一点缺陷,当然Singleton也不是没有缺点。
pleasureboy 2003-03-25
  • 打赏
  • 举报
回复
类的学习很重要.
刚开始学就能在这里学到很多多好东东
希望大家多给我点问题的答案啊
glassshark 2003-03-24
  • 打赏
  • 举报
回复
将类数据成员全部定义为静态成员。
sailor_Song 2003-03-24
  • 打赏
  • 举报
回复
up
TopCat 2003-03-24
  • 打赏
  • 举报
回复
晕倒,这个例子是我写的。

不过前几天刚看了Effictive C++,发现这个例子还是有点问题,应该改成如下:

class CDebug
{
public:
~CDebug();

void Print(const char *prompt, ...);
static CDebug &GetInstance()
{
static CDebug s_debug;
return s_debug;
}
private:
HANDLE m_StdOut;

//防止直接生成实例
CDebug();
};
huazaimh 2003-03-24
  • 打赏
  • 举报
回复
一个朋友给我的回答,你可以看看,这个问题有几个朋友提出来过!
class CDebug
{
public:
~CDebug();

void Print(const char *prompt, ...);
static CDebug &GetInstance() { return s_debug; };
private:
static CDebug s_debug;
HANDLE m_StdOut;

CDebug();
};
Cybergate 2003-03-24
  • 打赏
  • 举报
回复
问题点数: 0
alan118 2003-03-24
  • 打赏
  • 举报
回复
我在www.vckbase.com上看到的代码:


////////MyClass 只能有一个对象

#include <iostream>



using namespace std;

class MyClass
{
public:
static MyClass* GetInstance()
{
static bool bInit = false;
if (bInit == false)
{
bInit = true;
cout<<"object building......"<<endl;
m_pInstance = new MyClass();
}
cout<<"one object has been built."<<endl;

return m_pInstance;
}
private:
MyClass() {}

static MyClass *m_pInstance;
};

MyClass* MyClass::m_pInstance = NULL;



int main()
{
MyClass* p=MyClass::GetInstance();
MyClass* pp=MyClass::GetInstance();
return 0;
}


输出:
object building.....
one object has been built
one object has been built


这是设计模式里的singleton,还没看到,只是翻了一下,有点印象,呵呵
tuxw 2003-03-24
  • 打赏
  • 举报
回复
class one {
static int cnt;
...
public:
one()
{
cnt++;
if(cnt!=1) {
cout << "can't create two object of one\n";
exit(0);
}
...
}

};
int one::cnt=0;
TopCat 2003-03-24
  • 打赏
  • 举报
回复
其实很简单,一个Singleton根本不让你写这样的语句:MyClass my1; //错误!
因为这样根本无法保证单实例。

一般的形式是这样:MyClass &rmy1 = MyClass::GetInstance(); 或者是: MyClass *pmy1 = MyClass::GetInstance();

只允许用引用或者指针来指向这个“单个实例”
wshcdr 2003-03-24
  • 打赏
  • 举报
回复
有一点点明白
skfox 2003-03-24
  • 打赏
  • 举报
回复
1,将构造函数设置为私有的(这样就不能创建类了)
2,在该类中声明一友元函数(返回值为类)
3,在友元函数内,New一个对象的实例,注意必须是static的(保证只有一个实例),并返回该类
4,然后在main()中调用这个友元函数就创建了实例,并能保证只有一个
亮剑_ 2003-03-24
  • 打赏
  • 举报
回复
好像以前有人问过了,在构造函数上做手脚,用静态变量。具体你搜一下以前的帖子看看。

69,378

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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