1

最近,我即将开始从事一个涉及重构和修改 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());
}

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

请原谅我糟糕的英语,有没有更好的方法来实现这一点?任何帮助将不胜感激,谢谢!

4

0 回答 0