如何使一个类只能实例化一个对象

 

如何使一个类只能实例化一个对象

时间:2008-05-17 05:19:08    来源:论坛整理   作者:   编辑:chinaitzhe
如何让类只能被实例化一个对象,也就是只能实例一次呢?
网友回复:Single模式..
网友回复:class A
{
private:
static A* m_a;
A();
public:
static A* Instance()
{
if (m_a == 0)
m_a = new A;
return m_a;
};
A* A::m_a = 0;

main()
{
A* a = A::Instance();
}
网友回复:/
#include <iostream>

// singleton
class A
{
public:
static A* GetInstance(void)
{
if ( m_pInstance == NULL )
m_pInstance = new A();
return m_pInstance;
}
// test function
void display()
{
std::cout < < "Hello, world " < < std::endl;
}

private:
// default constructor
A() {
std::cout < < "construction/n ";
}

private:
static A* m_pInstance;
};

// init static m_pInstance
A* A::m_pInstance = NULL;

int main()
{
A* ptr1 = A::GetInstance();
A* ptr2 = A::GetInstance();

ptr1-> display();
ptr2-> display();

//A* ptr3 = new A; // forbidden
//A obj; // forbidden

return 0;
}
//


//示例而已
网友回复:该回复于2008-05-02 19:03:22被治理员或版主删除
网友回复:定义为 static ini 类的函数
用1static 类指针来直接返回已经初始化过的实体

楼上的都是正确的例子。
网友回复:singleton
网友回复:Class Singleton{
static Singleton s;
int i;
Singleton(int x):i(x) { }
Singleton& operator=(Singleton&);
Singleton(const Singleton&);
public:
static Singleton& instance() { return s;}
int getvalue() { return i;}
void setvalue() { i = x;}
//要害是在类中声明一个类的实例,并将构造函数、拷贝构造函数、赋值构造函数声明为私有的,这样就能防止调用默认构造函数声明类的实例,只能用类的函数instance为一个新地向赋值,这样就保证了一个对象只实例一次。
int main()
{
Singleton& s = Singleton::instance();
cout < <s.getvalue() < <endl;
Singleton& s2 = Singleton::instance();
cout < <s2.getvalue() < <endl;
}
}
网友回复:正确
网友回复:经典设计模式
网友回复:singleton即可
网友回复:zwlzwlzwl()
支持:
美中不足,记得私有析构函数
网友回复://Singleton Module
class A
{
private:
static A* m_a;
A();
public:
static A* Instance()
{
if (m_a == 0)
m_a = new A;
return m_a;
};
A* A::m_a = 0;

int main()
{
A* a = A::Instance();
}
网友回复:WinWing(╃为爱狂奔九条街╃ What 's mine is mine)
你的例子,没有考虑到拷贝构造、复制赋值、析构的私有。
呵呵
网友回复:class A
{
private:
A(){}
A(const A&);
public:
static A& Instance()
{
static A instance;
return instance;
}
};

网友回复:使用单例设计模块
网友回复:这是设计模式的问题,如下:

class A
{
public:
class A *GetA(){if (m_a != NULL) m_a = new A; return m_a;};
void FreeA() {if (NULL != m_a) delete m_a; m_a = NULL;};
private:
static A * m_a;
}

外面用的时候,只能使用:
A *p = A:GetA();

这样来获取这个接口,记得退出之前要调用 A:FreeA();
网友回复:又要手动判定又要手动析构多麻烦。有的还压跟就没释放资源的接口。
网友回复:参考More Effective C 条款26。我上面给出的是C 中的一种常用方法。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值