将受保护的结构成员分配给朋友?

时间:2012-10-22 08:49:12

标签: c++ friend access-rights

我有一个包含MyObjects形式的数据的类,如A类。 我希望监视MyObject对象中的数据。所以我创建了一个IMonitorable类和 派生所有包含来自IMonitorable的MyObjects的存储类。添加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?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我无法确切地看到你在做什么,并且通过使用a作为一个类然后使用myData的成员来混淆你的事情。

但我认为问题在于友谊不会得到回报。

您已IMonitorable friend Monitor Monitor,但friend IMonitorable IMonitorable {偶然}如果您确实将其设为a的朋友,则无法访问源自它的{{1}}受保护成员。