C++对象计数

本文目的是实现一个实用的对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
};

时间: 2024-08-04 03:53:41

C++对象计数的相关文章

云计算用1.5KB内存为十亿对象计数方法

为了更好地理解已经明确基数的大数据集的挑战,我们假设你的日志文件包含16个字符的ID,并且你想统计不同ID的数量.例如: 4f67bfc603106cb2 这16个字符需要用128位来表示.6万5千个ID将需要1MB的空间.我们每天收到30多亿条事件记录,每条记录都有一个ID.这些ID需要3840亿位或45GB的存储.而这仅仅是ID字段需要的空间.我们采取一种简单的方法获取日常事件记录中以ID为基数的数据.最简单的办法就是使用哈希集合且存放到内存中,其中哈希集包含唯一ID的列表(即输入文件中可能

对象存储九大关键特征

 对象存储是一个相对较新并且在持续稳步增长的市场部分.对于新手而言,对象存储用于保存大量非结构化数据,其中每个"对象"实际上是一个没有特定格式的文件(也称二进制文件).实际上,从小的对象(人类可读取文件)到媒体(音频和视频)或其它行业特定格式(石油&天然气,医学成像等),对象存储可以保存任何类型的数据. 与传统存储相比,采用对象存储的好处良多.基于块的系统(例如光纤通道和iSCSI)无法很好地向外扩展,并且没有真正的了解所存储的数据.它们是以低延迟和高粒度提供内容的"

盘点对象存储九大关键点

 有评论表示,对象存储是一个相对新的市场部分,目前继续稳步增长,并有更多值得采用的理由. 对于不了解的人来说,对象存储用于保存大量的非结构化数据,其中每个"对象"本质上是没有特定格式的文件(也称为二进制文件).对象存储可以保存任何类型的数据,从人类可读的小对象文件到媒体(音频和视频)或其他行业特定的格式(石油和天然气,医学成像等). 与传统存储相比,使用对象存储的好处是多方面的.基于块的系统(例如光纤通道和iSCSI)不能很好地向外扩展,并且对存储的数据没有真正的理解.它们是以低延迟和

解读对象存储九大关键特征

对象存储是一个相对较新并且在持续稳步增长的市场部分.对于新手而言,对象存储用于保存大量非结构化数据,其中每个"对象"实际上是一个没有特定格式的文件(也称二进制文件).实际上,从小的对象(人类可读取文件)到媒体(音频和视频)或其它行业特定格式(石油&天然气,医学成像等),对象存储可以保存任何类型的数据. 与传统存储相比,采用对象存储的好处良多.基于块的系统(例如光纤通道和iSCSI)无法很好地向外扩展,并且没有真正的了解所存储的数据.它们是以低延迟和高粒度提供内容的"哑

SQL Server联机丛书:存储过程及其创建

server|创建|存储过程  存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.有条件执行以及其它强大的编程功能.存储过程可包含程序流.逻辑以及对数据库的查询.它们可以接受参数.输出参数.返回单个或多个结果集以及返回值. 可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点: 可以在单个存储

SQL Server 2005 中的批编译、重新编译和计划缓存问题(4)

下面,考虑以下 T-SQL 代码段:-- dbo.someTable will be used to populate a temp table-- subsequently.create table dbo.someTable (a int not null, b int not null)godeclare @i intset @i = 1while (@i <= 2000)begin insert into dbo.someTable values (@i, @i+5) set @i =

用拷贝钩子实现对文件夹的监控

ICopyHook是一个用于创建拷贝钩子处理程序COM接口,它决定一个文件夹或者打印机对象是否可以被移动,拷贝,重命名或删除.Shell在执行这些操作之前,会调用ICopyHook接口的CopyCallback方法对它们进行验证.CopyCallback返回一个int值指示Shell是否应该继续执行这个操作.返回值IDYES表示继续,而返回值IDNO和IDCANCEL则表示终止. 一个文件夹对象可以安装多个拷贝钩子处理程序.如果出现这种情况,Shell会依次调用每个处理程序.只有当每个处理程序都

Git远程09:Git服务搭建

GitHub和Gitlab是最常见的两个免费的Git Server,本博客就是搭建在GitHub上,GitLab没有于GitHub出名,其提供了免费的私有Git库,GitHub的私有库则是收费的.也可以在自己的服务器上搭建Git远程库,推送和拉取的速度比直接使用GitHub快,也不会存在安全性问题,本文介绍相关操作. 环境 操作系统:CentOS6.6 服务器IP地址:192.168.80.6 服务器Git版本:1.7.1 若服务器没有安装Git,请先安装. 1 # yum install gi

iOS深拷贝与浅拷贝、NSString内存分配

copy与retain的区别:          1)copy是创建一个新对象,retain是创建一个指针,引用对象计数加1.Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化.copy减少对象对上下文的依赖.          2)retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1也就是说,retain 是指针拷贝,copy 是内容拷贝. ? 1 2 3 4 5 6 7 8 9 10