最近,我即将开始从事一个涉及重构和修改 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());
}
这工作正常,但意味着很多副本。并且对象的属性可能已经过时,因为在用户获得复制对象后,新模块中的对象可能会发生变化(新模块中的对象不是同一个对象)。
请原谅我糟糕的英语,有没有更好的方法来实现这一点?任何帮助将不胜感激,谢谢!