设计一个类,只能实现1个实例或3个实例
来源:互联网 发布:淘宝如何做详情页 编辑:程序博客网 时间:2024/05/22 04:29
/*********************************************题目:1)设计一个类,我们只能生成该类的一个实例2)设计一个类,只能生成该类的3个实例******************************************///1)#include<iostream>using namespace std;class CSingleton { public: static CSingleton * GetInstance() { if(NULL == m_pInstance) m_pInstance = new CSingleton(); return m_pInstance; } static void Release() //必须,否则会导致内存泄露 { if(NULL != m_pInstance) { delete m_pInstance; m_pInstance = NULL; } } protected: CSingleton() { cout<<"CSingleton"<<endl; }; static CSingleton * m_pInstance; }; CSingleton* CSingleton::m_pInstance = NULL; int main(){CSingleton* pSingleton1 = CSingleton::GetInstance();CSingleton* pSingleton2 = CSingleton::GetInstance();if(pSingleton1 == pSingleton2){cout << "Produced one instance !"<<endl;pSingleton1->Release();}else{cout << " Produced two instances !"<<endl;pSingleton1->Release();pSingleton2->Release();}return 0;}为了防止从类的外部调用构造函数,产生类的新的实例,我们应该把该类的构造函数声明成protected或者private。
由于只能生成一个类的实例,我们可以考虑用静态成员函数来记录,到底之前有没有构造过类的实例。如果没有构造过,那么就构造一个新的实例。
如果构造过,那么就把之前构造的那个实例返回。为了保证之前构造的实例,在程序运行期间一直存在,不被析构,我们只能把指向这个实例的指针声明成静态变量,
存放在静态存储区,把这个类的实例用new来构造,并放在堆里。
//2)#include<iostream>using namespace std;class finalclass{public: static int count;public:static finalclass *getinstance(){if(count <= 0)return NULL;count--;return new finalclass;}static void setcount(int n){count = n;}private: finalclass(){}~finalclass(){}};int finalclass::count = 0;int main(){ finalclass::setcount(3); finalclass *f1 = finalclass::getinstance(); finalclass *f2 = finalclass::getinstance(); finalclass *f3 = finalclass::getinstance(); if(f3 == NULL) printf("f3 NULL\n");else printf("f3 NOT NULL\n");finalclass *f4 = finalclass::getinstance();if(f4 == NULL) printf("f4 NULL\n");finalclass *f5 = finalclass::getinstance();if(f5 == NULL)printf("f5 NULL\n");}
参考:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html
http://www.2cto.com/kf/201304/202169.html
mark:
http://www.cnblogs.com/08shiyan/archive/2012/03/16/2399617.html
0 0
- 设计一个类,只能实现1个实例或3个实例
- 0..1:0 或1 个实例. 0..*: 对实例的数目没有限制. 1: 只能有一个实例. 1..*: 至少有一个实例.
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 【中科大洋笔试题】定义一个不能被继承的类,并且只能实例化3个对象。
- 设计一个类,我们只能生成该类的一个实例。
- 设计一个类,我们只能生成该类的一个实例
- 设计一个类,我们只能生成该类的一个实例。
- 设计一个类只能生成该类的一个实例
- 设计一个类,只能生成该类的一个实例
- 实现一个类只能被实例化一次
- 剑指officer第二题:题目:设计一个类,我们只能生成该类的一个实例(五种方法实现)
- 设计一个类,该类不能被继承,且只能实例化3次
- 设计一个类,该类不能被继承,且只能实例化3次
- 简单工厂模式的UML类图与源码实现
- Your Ubuntu 12.04 is running in 2D mode,Many features will not be available.(on Ubuntu 12.04)解决方法
- 记一次解决jenkins持续构建,自动部署的问题
- hadoop怎样创建 mapreduce项目简易例子教程
- 当在写android的xml文件中出现Unexpected text found in layout file: """的解决办法
- 设计一个类,只能实现1个实例或3个实例
- 怎么用VS2005打开VS2008
- hdu,2037,今年暑假不AC
- 获取MS SqlServer 2000中字段的备注信息
- LeetCode 007 Reverse Integer
- Mysql数据库学习(四):常用Mysql C API 介绍和使用、封装一个访问Mysql数据库的类MysqlDB
- ubuntu 13 sogou input method install
- V8 引擎编译 测试 64位+VS2012
- 基于CAS实现单点登录(SSO):分享过程中遇到的问题及解决方案,让你少走弯路