当前位置:主页   - 电脑 - 程序设计 - C/C++
C++对象计数
来源:网络   作者:   更新时间:2012-02-15
收藏此页】    【字号    】    【打印】    【关闭

  本文目的是实现一个实用的对C++类计数的类,同时在实现过程中指出一些容易为人忽视的C++知识。

  要实现一个类的对象(实例)计数,即程序运行中此类有多少个对象存在,最容易的实现方法是使用静态数据成员。如下:class Widget {
public:
  Widget() { ++count; }
  Widget(const Widget&) { ++count; }
  ~Widget() { --count; }
  static size_t howMany()
  { return count; }
private:
  static size_t count;
};   
//cpp文件中
size_t Widget::count = 0;
注意构造函数也要增加计数,这一点很多人容易忘记。

  但是如果程序中有多个需要实例计数的类,则在每个类中加入上面代码未免繁琐、易错。这种情况下,最好是实现一个通用计数类。它应该具备一下特点:

  • 易于使用:任何需要计数的类(以下简称客户类)只要添加少数代码即可使用;
  • 有效率:不增加客户类大小,对客户类性能没有影响;
  • 健壮:客户类使用时,不容易误用。
  •   下面我们将逐步实现并完善这个通用的计数类。

    class Counter { 
    public:     
      Counter() { ++count; }
      Counter(const Counter&) { ++count; }
      ~Counter() { --count; }
      static size_t howMany()
        { return count; }
    private:
      static size_t count;
    };
    // This still goes in an implementation file
    size_t Counter::count = 0;   
    上面这个Counter类能否正确完成计数呢?例如:Widget类利用它来进行实例计数:// embed a Counter to count objects
    class Widget {
    public:
      ..... // all the usual public
          // Widget stuff
      static size_t howMany()
      { return Counter::howMany(); }
    private:
      ..... // all the usual private
          // Widget stuff
      Counter c;
    };  
    //or:
    // inherit from Counter to count objects
    class Widget: public Counter {
      ..... // all the usual public
          // Widget stuff
    private:
      ..... // all the usual private
          // Widget stuff
    };      
      对于Widget本身来说,Counter完成了任务。然而,如果我们在同一进程中还需要利用Counter来计数Fish类,显然,Counter就不能胜任,因为它只有一个静态成员变量,它会将Widget和Fish的个数一起统计。这个方案不行,怎么办?用模板!如下:template<typename T>
    class Counter {
    public:
      Counter() { ++count; }
      Counter(const Counter&) { ++count; }
      ~Counter() { --count; }
      static size_t howMany()
      { return count; }
    private:
      static size_t count;
    };
    // this now can go in header
    template<typename T> size_t Counter<T>::count = 0;      
    则上面的实现变成:// embed a Counter to count objects
    class Widget {
    public:
      .....
      static size_t howMany()
      {return Counter<Widget>::howMany();}
    private:
      .....
      Counter<Widget> c;
    };
    //or:
    // inherit from Counter to count objects
    class Widget: public Counter<Widget> {  
      .....
    };   
      这样,其他类就可以使用Counter计数自己的实例了,它们将互不影响。

    其它资源
    来源声明

    版权与免责声明
    1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
    2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
    3、本站部分文章来源于本站原创,本站拥有所有权利。
    4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
    请参阅权责声明