3つの異なるクラス(A、B、C)があり、それぞれが共有オブジェクト(オブジェクトX)へのshared_ptrを持っています。私がやりたいのは、オブジェクトXに誰がそれを指しているかについての情報を与えることです。たとえば、それを指すAオブジェクトがない場合、更新時にAクラスによってのみ使用されるデータを計算する必要はありません。また、オブジェクトXは、それを指すCオブジェクトへのポインターのベクトルを保持できるため、Cオブジェクトに関連する一部のデータが更新されたときに、オブジェクトXで関数を呼び出すことができます(ただし、Cオブジェクトは、オブジェクトXから他のデータを照会するためにそれを指します。 )。
私が考えていたのは、ラッパーが構築/割り当て/破棄されるたびにX上の関数へのポインターを呼び出す各クラスのshared_ptrのラッパークラスを作成することです(Xの参照カウントをインクリメント/デクリメントするのと同じ場合) 。コードのアイデアは次のとおりです。
class A
{
public:
A() : m_ptr(&X::IncrementACount, &X::DecrementACount) { }
void SetX( const std::shared_ptr<X> &ptr ) { m_ptr = ptr; }
private:
shared_ptr_wrapper0<X> m_ptr;
};
class B
{
public:
B() : m_ptr(&X::IncrementBCount, &X::DecrementBCount) { }
void SetX( const std::shared_ptr<X> &ptr ) { m_ptr = ptr; }
private:
shared_ptr_wrapper0<X> m_ptr;
};
class C
{
public:
C() : m_ptr(this, &X::StoreCPointer, &X::RemoveCPointer) { }
void SetX( const std::shared_ptr<X> &ptr ) { m_ptr = ptr; }
private:
shared_ptr_wrapper1<X, const C*> m_ptr;
};
AとBの両方に、引数をとらないインクリメント/デクリメント関数が指定されたラップされたスマートポインターがあります。ラップされたスマートポインターが設定/クリアなどされると、それらの関数は、それに含まれるXオブジェクトで呼び出され、A/Bカウンターをインクリメント/デクリメントします。
Cには、(const C *型の)1つの引数を持つラップされたスマートポインターがあります。set / cleard / etcを取得すると、Cのコンストラクター(thisポインター)によって格納されたデータを使用して関数が呼び出され、オブジェクトXのベクトルに追加または削除されます。
だから私の主な質問はこれは良い考えですか?誰がオブジェクトを指しているのかを追跡するというこのアイデアを実現するためのより良い方法はありますか?この種のアイデアの具体的な名前はありますか(私がこのようなものを最初に試したとは想像できませんが、検索しても何も見つからなかったので、正しい名前がわからない可能性があります探す...)
ありがとうございました。