我有一个包含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?
答案 0 :(得分: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);
答案 1 :(得分:1)
我无法确切地看到你在做什么,并且通过使用a
作为一个类然后使用myData的成员来混淆你的事情。
但我认为问题在于友谊不会得到回报。
您已IMonitorable
friend
Monitor
Monitor
,但friend
IMonitorable
IMonitorable
{偶然}如果您确实将其设为a
的朋友,则无法访问源自它的{{1}}受保护成员。