指针与相关代码重构

时间:2013-06-17 09:01:41

标签: refactoring

最近,我即将开始研究一个涉及在c ++中重构和修改现有代码的项目。

我的项目缓存了许多在它们之间具有父子关系的对象,每个对象都有一个唯一的ID。请参阅以下代码:

class GetReleation
{
  tempalte<typename T>
  T* GetParent(const int &iID);

  tempalte<typename T>
  map<int, T*> GetChildren(const int &iID);

  .....
}

class ObjectClass
{
  int GetID();
  int GetOhterProperty();

  ......
}

项目中缓存的对象在运行期间从未更改过,因此可以避免锁定。以下代码工作正常。

ObjectType pObject = getReleation.GetParent(iID);
pObject->GetOhterProperty();

但是现在,对象可能在运行期间添加/修改/删除,新模块被添加到缓存对象并管理对象更改。 它具有读写锁以保护多线程访问,所有对象都使用boost share_ptr进行缓存。 新模块推荐直接函数来获取对象的属性(用于多线程安全使用), 你不应该得到对象的指针,然后使用指针获取属性。

为了达到获取对象属性的目标,有以下方法:

1)NewModule ObjectVisitClass.GetProperty(iID);

GetReleation有很多类使用成员函数,直接使用新模块意味着要做很多工作。

2)使用GetReleation,但改变成员函数的实现。

T* GetParent(const int &iID)
{
   Get boost share_ptr<T> from new module;
   return boost share_ptr<T>::get();
}

GetReleation的用户获取对象的指针,在多线程中将核心转储,因为当用户获取对象的指针时,该对象可能已在新模块中被删除。

我们可以返回boost share_ptr :: get()

的新副本对象
T* GetParent(const int &iID)
{
   Get boost share_ptr<T> from new module;
   return new T(*boost share_ptr<T>::get());
}

这很好用,但意味着很多副本。对象的属性可能已经过时,因为在用户获取复制对象(不是同一个对象)后,对象可能会在新模块中发生变化 在新模块中。)

请原谅我可怜的英语,有没有更好的方法来实现这个目标? 任何帮助都会很感激,谢谢!

0 个答案:

没有答案