Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103782360
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-05-18 20:23:45

  来源:

这种情况发生在传统的C++类对象中指针成员串行化与反串行化时,例1,是一段带有重载>>与<<符,串行及反串行化CJobInst与CJobDef类指针的CArchive类代码,也证明了这点。

  例1:

以下是引用片段:
class CJobDef
  {
  friend CArchive & operator >> (CArchive &ar, CJobDef *def)
  {
  ar >> def->command;
  }
  friend CArchive & operator << (CArchive &ar, CjobDef *def)
  {
  ar << def->command;
  }
  private:
  std::string command;
  };
  class CJobInst
  {
  friend CArchive & operator >> (CArchive &ar, CJobInst *inst)
  {
  inst->m_def = new CJobDef;
  ar >> inst->m_def;
  }
  friend CArchive & operator << (CArchive &ar, const CJobInst *inst)
  {
  ar << inst->m_def;
  }
  private:
  CJobDef *m_def;
  };

  在CJobInst中串行化CJobDef的私有成员m_def涉及到调用CArchive类中适当的<<操作符,重载的<<操作符通过把对象串行化进一个永久的存档文件,来实现对CJobDef指针的串行化;反串行化CJobDef指针涉及到构造一个新的对象,并调用>>操作符从存档文件中更新属性。

  解决方案

  引用计数智能指针是由继承自CReferable类一个对象实现的,其包含了一个私有引用计数器及用于修改其值的increaseReferenceCount()与decreaseReferenceCount(),而相应的Ref模板类,通过->、*、= 操作符重载,也实现了访问此对象及对生命期的管理。Ref模板对智能指针的赋值操作,会递增对象的引用计数,而它的析构函数会递减计数。智能指针中的对象只当它的引用计数为零时被销毁。在上面的作业调度系统中,CJobDef对象被包装在一个CJobDefPtr类型中,其由以下语句定义:

以下是引用片段:
typedef Ref CJobDefPtr;

  这个CJobDefPtr类型,正是类CScheduler所用到的类型。当用户提交一个作业到事件作业调度器时,会产生一个CJobDefPtr类型新的对象,且会赋予它CJobDef对象;此后,当作业实例创建时,也正是这个CJobDefPtr类型赋予给了实例。图3演示了类CScheduler使用的CJobDefPtr类型。

  图3:作业定义类关系图


阅读(227) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~