我有一个类,它包含MyObjects形式的数据,如类A。
我希望监视MyObject对象中的数据。所以我创建了一个IMonitorable类,
从IMonitorable派生了所有包含MyObjects的存储类。 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结构的存储类时,此方法运行良好。我打了电话

AddData(InstanceOfA);


并将MyObject a,b,..添加到我的监视机制中。

现在,我有几个存储类,并且我不想为所有存储类编写AddData方法。我想到了一个AddObject方法,使其能够具有适用于所有存储类的单个点。

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


但是,如果我在代码中的某处调用gcc会抛出错误数据.a被保护,那是对的。

有没有办法在不知道存储类结构的情况下将受保护的MyObject的引用或指针添加到Monitor?

最佳答案

您声明struct myData为受保护。 friend IMonitorableIMonitorable声明为朋友类,这意味着IMonitorable可以访问Monitor类的私有成员。要从Monitor访问私有成员,请使用getter功能:

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);

09-26 14:40