《more effective c++》条款26 限制类对象的个数
问题:
如何限制类对象的个数?比如1个,10个等等。
方法(1):
将类的构造函数定义为private,那么就无法实例化这个类了。但是如何创建1个对象出来?方法有2种:
1.声明一个友元函数,那么在友元函数中就可以调用构造函数了,创建对象时使用static限制,那么就保证只有一个对象了。类似的定义如下:
class Printer
{
public:
friend Printer& thePrinter();
private:
Printer();
Printer(const Printer& rhs);
};
Printer& thePrinter()
{
static Printer p;
return p;
}
2.定义一个静态成员函数来代替上面的友元函数也是可以达到同样效果的,就是调用时麻烦了些,需要加上类名才能调用函数,但是这也是可以解决的,将类定义在一个命名空间(namespace)中,再using该命名空间即可直接使用函数名来调用了(具体去看如何定义命名空间)。使用命名空间还可以防止出现名字冲突问题,而且将对象声明在函数中的好处是,只有当调用该函数时,对象才会被创建。注意:尽量不要在内联函数中创建静态对象,可能产生多个副本。
class Printer
{
public:
static Printer& thePrinter();//注意这里
private:
Printer();
Printer(const Printer& rhs);
};
Printer& thePrinter()
{
static Printer p;
return p;
}
方法(2):
在类中定义一个静态计数器,通过计数器来限制实例对象的个数,一旦创建超过限制的个数就抛出异常。这貌似更加好用。
如果单例类是作为基类被继承,那么派生类对象中的基类部分也会被统计进去了,比如彩色打印机继承自打印机,而现在有1台打印机,2台彩色打印机,计数器就是3了。显然不符合我们的要求,我们可以通过private构造函数,那么单例类就无法被继承了。
允许对象来去自由
通常情况下,我们希望可以这样:
create Printer1;
use Printer1;
destroy Printer1; create Printer2;
use Printer2;
destroy Printer2;
但是方法(1)并不能支持。但是结合计数器就可以实现了。具体看书 P105中的代码例子。
一个用于对象计数的基类
如果需要多个具体类怎么办?难道一个个去写去实现?其实可以用模板类作为基类来完成这个功能,使用前将设置一下实例个数就可以使用了,具体看书 P107。
《more effective c++》条款26 限制类对象的个数的更多相关文章
- Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为
三.资源管理 资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...
- Effective C++ 条款26
尽可能延后变量定义式的出现时间 我们知道定义一个对象的时候有一个不争的事实,那就是分配内存.假设是我们自己定义的对象.程序运行过程中会调用类的构造函数和析构函数. 我们打个例如,假设天下雨了,你带把雨 ...
- Effective C++ -----条款13:以对象管理资源
为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII class ...
- Effective C++ 条款12:复制对象时勿忘其每一个成分
void logCall(const std::string& funcName); class Customer { public: ... Customer (const Customer ...
- Effective C++ 条款04:确定对象被使用前已经先被初始化
规则一 永远在使用对象之前将它初始化 int x = 0; const char* text = "A C-style string"; double d; std:: cin & ...
- Effective C++ -----条款26:尽可能延后变量定义式的出现时间
尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率.
- effective c++ 条款26 postpone variable definition as long as possible
因为构造和析构函数有开销,所以也许前面定义了,还没用函数就退出了. 所以比较好的方法是用到了才定义.
- Effective Objective-C 2.0 — 第14条:理解“类对象“的用意
每个实例都有一个指向Class 对象的指针,用以表明其类型,而这些 Class 对象则构成了类的继承体系. 如果对象类型无法在编译期确定,那么就应该使用类型信息查询方法来探知. 尽量使用类型信息查询方 ...
- MoreEffectiveC++Item35 条款26: 限制某个class所能产生的对象个数
一 允许零个或一个对象 我们知道每当即将产生一个对象,我们有一个constructor被调用,那么我们现在想组织某个对象的产生,最简单的方法就是将其构造函数声明成private(这样做同事防止了这个类 ...
随机推荐
- 个人收集的一些网页上一键云DDOS攻击的网站、IP地址测试,服务器压力测试
http://bbs.itzmx.com/thread-9018-1-1.html #1 - Network Stresser - http://networkstresser.com#2 - Lif ...
- mysql 远程连接速度慢的解决方案
PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接MYSQL正常,出现这种问题的主要原因是,默认安装的MYSQL开启了DNS的反向解析,在MY.INI(WINDOWS ...
- C# 检测网络链接
;//Local system uses a modem to connect to the Internet. ; //Local system uses a local area network ...
- API 进程、线程函数
CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 ConnectNamedPipe 指 ...
- YouTube技术架构
谈不上翻译,就是摘录 1 billion video views per day 1.Apache 2.Python 3.Linux (SuSe) 4.MySQL 5.psyco, a dynamic ...
- [css3]文字过多以省略号显示
text-overflow:ellipsis; 优点: 1.不用通过程序限定字数 2.有利于SEO(实际上并未被截字,只是局限于宽度未被显示而已) width: 某个值; overflow: hidd ...
- Js练习题之字符串转驼峰
如border-bottom-color =>borderBottomColor 传传统方法 分析: 1.转大写,需要用到字符串的toUpperCase()方法 2.去掉-,需要用到字符串方法s ...
- include指令和<jsp:include>标准动作
利用JSP的包含机制,可以有效的避免重复,把可重用的部分独立出去,使用include把它们包含到当前文件.JSP有两种包含机制:include指令和<jsp:include>标准动作. 1 ...
- bitset常用函数用法记录 (转载)
有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值.位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法.标准库提供了bitset类使得处理位集合更容易一些.要使 ...
- String字符串包含运算符实现运算
string aa = "(1+2)/3+(3+4)*5"; DataTable dt = new DataTable(); string b = dt.Compute(aa, & ...