0

クラス A のような MyObjects の形式でデータを含むクラスがあります。MyObject オブジェクトのデータを監視したいと考えています。そこで、IMonitorable クラスを作成し、MyObjects を含むすべてのストレージ クラスを IMonitorable から派生させました。Add は、IMonitorable クラスをフレンドとして監視クラスに追加しました。

class IMonitorable
{}        

class a : public IMonitorable
{
protected:
   struct myData
   {
      MyObject a;
      MyObject b;
      ...
   } data;
}

class Monitor
{
public:
   friend IMonitorable;
   AddData(a& stroage);
   AddObject(MyObject& obj);

}

これは、既知の myData 構造体を持つストレージ クラスが 1 つある間は問題なく機能しました。私は呼びました

AddData(InstanceOfA);

MyObject a、b、..を監視メカニズムに追加しました。

現在、いくつかのストレージ クラスがあり、すべてのストレージ クラスに対して AddData メソッドを記述したくありません。すべてのストレージ クラスに適した単一のポイントを持つことができる AddObject メソッドを持つことを考えました。

AddObject(InstanceOfA.data.a);
AddObject(InstanceOfA.data.b);
...

しかし、コードのどこかでこれを呼び出すと、gcc が data.a is protected というエラーをスローします。

ストレージ クラスの構造を知らなくても、保護された MyObject の参照またはポインタを Monitor に追加する方法はありますか?

4

2 に答える 2

1

あなたはstruct myData保護されていると宣言しました。クラスのプライベートメンバーにアクセスできることを意味するフレンドクラスとしてfriend IMonitorable宣言します。関数を使用してプライベート メンバーにアクセスするには:IMonitorableIMonitorableMonitorMonitorgetter

class a : public IMonitorable
{
public:
   const myData* const getData()const
   {
      return &data;
   }
   myData* getData()
   {
      return &data;
   }
protected:
   struct myData
   {
      MyObject a;
      MyObject b;
      ...
   } data;
}

これを使って:

AddObject(InstanceOfA.getData()->a);
于 2012-10-22T09:01:07.427 に答える
1

あなたが何をしているのか正確にはわかりませんa。また、クラスと myData のメンバーの両方を使用することで、物事を混乱させています。

しかし、問題はその友情が報われないことだと思います。

あなたは of を作成しましIMonitorableたが、それはofを作成しません。また、ついでにそれをフレンドにしたとしても、それから派生する保護されたメンバーにはアクセスできません。friendMonitorMonitorfriendIMonitorableIMonitorablea

于 2012-10-22T09:17:44.680 に答える