назначение защищенного члена структуры другу?

У меня есть классы, которые содержат данные в форме 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 на монитор без знания структуры класса хранения?

0

Решение

Вы объявили 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

Другие решения

Я не могу точно видеть, что вы делаете, и вы путаете вещи, используя a и как класс, а затем член myData.

Но я думаю, что проблема в том, что эта дружба не отвечает взаимностью.

Вы сделали IMonitorable friend из Monitor, но это не делает Monitor friend из IMonitorableи, между прочим, даже если вы подружились IMonitorable он не получит доступ к защищенным членам a что вытекает из этого.

1

По вопросам рекламы [email protected]