用C++如何实现单例模式??

myjirong 2003-03-14 01:54:57
我想用C++实现单例模式,代码如下:
#include <iostream.h>
class A
{
private:
A(){ }
~A(){}
static A valofA ;

public:
static A* f()
{
return &valofA;
}
};
//static A:: valofA;
int main(int argc, char* argv[])
{
A *pA;
pA = A::f();
return 0;
}
不成功.
问题点是static private member 初始化如何实现.
thanks
...全文
118 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Schlemiel 2003-03-14
  • 打赏
  • 举报
回复
死猫说错了,Design Pattern书中没有Singleton模式的完整代码,只有采用指针的版本,但是没有对象析构。依靠程序退出时的自动销毁,我总是觉得不保险。
其实Singleton可以说是最难实现的一个模式。MCD里的实现算是比较完美的,但是又太过复杂。如果不是真有需要,还是用静态实例的好。
shornmao 2003-03-14
  • 打赏
  • 举报
回复
请看<<Design Pattern>>有很完整的代码,干吗在这里大家浪费时间比来比去。
使用静态成员对象的方法,缺点是,不能确定他的初始化顺序,这个本来就是singleton要解决的问题之一,这样的话,我直接用全局变量不就可以了吗?
所以应该是用指针作为静态数据成员。
使用指针的问题在于没有一个简单可靠的方法,在程序退出时自动销毁。
windcsn 2003-03-14
  • 打赏
  • 举报
回复
写法错误,这样写
class A
{
private:
A(){ }
~A(){}

public:
static A* f()
{

static A valofA ;
return &valofA;
}
};
efanl 2003-03-14
  • 打赏
  • 举报
回复
可惜没有析构函数,哈哈哈~~~
我想到一个办法解决,就是再设计两个函数,作为类 A 的友元:
#include <iostream>
using namespace std;

class A
{
private:
static A *pa;
static int num;
A(){cout << "Constructor A::A();" << endl;}
A(A & copy);
~A(){}
friend A* getInstance (void);
friend void releaseInstance (void);
};
A* getInstance (void)
{
if (A::num ==0)
{
A::pa = new A;
A::num++;
}
return A::pa;
}

void releaseInstance (void)
{
if (A::num >0)
{
delete A::pa;
A::num =0;
A::pa = NULL;
}
}

A* A::pa = NULL;
int A::num =0;

int main (void)
{
A* pa =getInstance ();
releaseInstance ();
return 0;
}

不过很不完善就就是了,最好还是设计一个代理类,而不要使用指针。
xiyi168 2003-03-14
  • 打赏
  • 举报
回复
#include <iostream.h>
class A
{
private:
A(){ }
~A(){}
static A valofA = new A(); /////new()

public:
static A* f()
{
return &valofA;
}
};
//static A:: valofA;
int main(int argc, char* argv[])
{
A *pA;
pA = A::f();
return 0;
}
efanl 2003-03-14
  • 打赏
  • 举报
回复
在 VC7 下编译链接通过,不知道是不是你想要的:

#include <iostream>
using namespace std;

class A
{
private:
static A *pa;
A(){cout << "Constructor A::A();" << endl;}
A(A & copy);
public:
static A* getInstance (void){return pa;}
};
A* A::pa = new A;
int main (void)
{
A* pa = A::getInstance ();
return 0;
}

65,210

社区成员

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

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