最近,我即将开始研究一个涉及在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());
}
这很好用,但意味着很多副本。对象的属性可能已经过时,因为在用户获取复制对象(不是同一个对象)后,对象可能会在新模块中发生变化 在新模块中。)
请原谅我可怜的英语,有没有更好的方法来实现这个目标? 任何帮助都会很感激,谢谢!