《more effective c++》条款26 限制类对象的个数

问题:

  如何限制类对象的个数?比如1个,10个等等。

方法(1):

  将类的构造函数定义为private,那么就无法实例化这个类了。但是如何创建1个对象出来?方法有2种:

  1.声明一个友元函数,那么在友元函数中就可以调用构造函数了,创建对象时使用static限制,那么就保证只有一个对象了。类似的定义如下:

 1 class Printer
 2 {
 3 public:
 4     friend Printer& thePrinter();
 5 private:
 6     Printer();
 7     Printer(const Printer& rhs);
 8 };
 9 Printer& thePrinter()
10 {
11     static Printer p;
12     return p;
13 }

  2.定义一个静态成员函数来代替上面的友元函数也是可以达到同样效果的,就是调用时麻烦了些,需要加上类名才能调用函数,但是这也是可以解决的,将类定义在一个命名空间(namespace)中,再using该命名空间即可直接使用函数名来调用了(具体去看如何定义命名空间)。使用命名空间还可以防止出现名字冲突问题,而且将对象声明在函数中的好处是,只有当调用该函数时,对象才会被创建。注意:尽量不要在内联函数中创建静态对象,可能产生多个副本。

 1 class Printer
 2 {
 3 public:
 4     static Printer& thePrinter();//注意这里
 5 private:
 6     Printer();
 7     Printer(const Printer& rhs);
 8 };
 9 Printer& thePrinter()
10 {
11     static Printer p;
12     return p;
13 }

方法(2):在类中定义一个计数器,通过计数器来限制实例对象的个数,一旦创建超过限制的个数就抛出异常。(请考虑继承的情况,派生类对象也会被t统计到了)

时间: 2024-12-14 18:04:58

《more effective c++》条款26 限制类对象的个数的相关文章

Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为

三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket等. 1.        以对象管理资源       void f() {     investment *plv = createInvestment();     //这里存在很多不定因素,可能造成下面语句无法执行,这就存在资源泄露的可能.     delete plv; }      这里我们

Effective C++ 条款26

尽可能延后变量定义式的出现时间 我们知道定义一个对象的时候有一个不争的事实,那就是分配内存.如果是我们自定义的对象,程序执行过程中会调用类的构造函数和析构函数. 我们打个比方,如果天下雨了,你带把雨伞肯定是值得的.但是,如果你带伞了,今天却没下雨,你是不是感觉自己亏了?的确,亏在了带了却没用,所以伞就变成了累赘. 本节的关键就在于此,如果你定义一个变量或者对象没有被使用,那么就是不完美的代码. 我们看一个代码片段: std::string encryptPassword(const std::s

effective c++ 条款12:复制对象时勿忘其每一个成分

记住:拷贝函数应该确保复制"对象内的所有成员变量"及"所有父类成分".不要尝试以某个拷贝函数实现另一个拷贝函数.应该将共同机能放进第三个函数中,并由两个拷贝函数共同调用. 下面是一个类实现了自己的拷贝函数,一起正常. void logCall(const string& funcName): class Customer { public: ... Customer(const Customer& rhs); Customer& operat

effective c++ 条款13:以对象管理

记住: 为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII类分别是tr1::shared_ptr和auto_ptr.前者通常是较佳选择,因为其copy行为比较直观.若选择auto_ptr,复制动作会使它(被复制物)指向null. class Investment { ... }; Investment* createInvestment(); void f() { Investment* pInv = createInvestment()

Effective C++ -----条款13:以对象管理资源

为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII classes 分别是tr1::shared_ptr和auto_ptr.前者通常是较佳选择,因为其copy行为比较直观.若选择auto_ptr,复制动作会使它(被复制物)指向null.

Effective C++ 条款21必须返回对象时,别妄想返回其reference

1. 虽然一般情况下传参使用const-by-reference-to-const比较好,但返回值有时必须是对象而不是引用: 当reference绑定到函数内创建的局部对象时,函数调用结束后引用绑定在一个不存在的对象; 当reference绑定到堆内存对象时,函数调用后比较容易忽略内存释放,特别对于以下表达式:w=x*y*z.如果operator*返回指向堆内存的引用,那没内存泄露是必然的; 当reference绑定到函数内部创建的static对象时,对于以下表达式if(a*b==c*d)由于返

02-类和对象-跟踪类对象创建个数

使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询"你已经创建了多少个对象"? 1 public class DuiXiang { 2 public static void main(String args[]) { 3 TongJi x=new TongJi(); 4 x.shuchu(); 5 TongJi y=new TongJi(); 6 y.shuchu(); 7 TongJi z=new TongJi(); 8 z.shuchu

《Effective C++》之条款26:尽可能延后变量定义式的出现时间

<Effective C++> 条款26:尽可能延后变量定义式的出现时间 只要你定义了一个变量而其类型带有一个构造函数和析构函数,那么当程序的控制流到达这个变量定义式时,你便得承受构造成本:当这个变量离开作用域时,你便得承受析构成本.即使这个变量最终并未被使用,仍需耗费这些成本,所以你应该尽量避免这种情形. 对于"尽可能延后"的理解: 不只应该延后变量多的定义,直到非得使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初始实参为止.如果这样,不仅能够避免构造(析构

Effective C++ 条款11,12 在operator= 中处理&ldquo;自我赋值&rdquo; || 复制对象时不要忘记每一个成分

1.潜在的自我赋值     a[i] = a[j];     *px = *py; 当两个对象来自同一个继承体系时,他们甚至不需要声明为相同类型就可能造成别名. 现在担心的问题是:假如指向同一个对象,当其中一个对象被删,另一个也被删,这会造成不想要的结果. 该怎么办? 比如:   widget& widget:: operator+ (const widget& rhs) {    delete pd;    pd = new bitmap(*rhs.pb);    return *thi