最近、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();
しかし、実行中にオブジェクトが追加/変更/削除される可能性があるため、新しいモジュールがキャッシュされたオブジェクトに追加され、オブジェクトの変更を管理します。マルチスレッドのアクセスを保護するための読み取り/書き込みロックがあり、すべてのオブジェクトはブースト 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());
}
これは問題なく動作しますが、大量のコピーを意味します。また、ユーザーがオブジェクトをコピーした後、新しいモジュールでオブジェクトが変更される可能性があるため (新しいモジュールの同じオブジェクトではない)、オブジェクトのプロパティが古くなっている可能性があります。
私の貧弱な英語を許してください、これを実装するためのより良い方法はありますか? どんな助けでも感謝します、Thx!