0

我有一个类,其中包含 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 会抛出错误 data.a 受到保护,什么是正确的。

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

4

2 回答 2

1

我无法确切地看到您在做什么,并且通过将a两者用作类和 myData 的成员来混淆事物。

但我认为问题在于这种友谊没有得到回报。

您已经制作IMonitorable了 a friendof Monitor,但这并没有制作Monitora friendof IMonitorable,并且顺便说一下,即使您确实将它设为它的朋友,IMonitorable也无法访问a从它派生的受保护成员。

于 2012-10-22T09:17:44.680 回答
1

您声明struct myData为受保护。friend IMonitorable声明IMonitorable为朋友类,这意味着可以访问类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);
于 2012-10-22T09:01:07.427 回答