У меня есть классы, которые содержат данные в форме MyObjects, как класс А.
Я хочу контролировать данные в объектах MyObject. Поэтому я создал класс IMonitorable и
извлек все мои классы хранения, которые содержат MyObjects из IMonitorable. Добавить добавил класс 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 на монитор без знания структуры класса хранения?
Вы объявили 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);
Я не могу точно видеть, что вы делаете, и вы путаете вещи, используя a
и как класс, а затем член myData.
Но я думаю, что проблема в том, что эта дружба не отвечает взаимностью.
Вы сделали IMonitorable
friend
из Monitor
, но это не делает Monitor
friend
из IMonitorable
и, между прочим, даже если вы подружились IMonitorable
он не получит доступ к защищенным членам a
что вытекает из этого.