Теперь, когда я сказал свою часть о наследовании, вот кое-что, что может помочь в вашем реальном вопросе, то есть, как обойти потенциальные проблемы с дружбой.
То, как я это делаю, - это создание чистого интерфейса для доступа к данным, которыми я хочу поделиться со своими «друзьями». Затем я реализую этот интерфейс в частном порядке, чтобы никто не мог получить к нему доступ напрямую. Наконец, у меня есть механизм, который позволяет передавать ссылку на интерфейс только тем избранным классам, которые я хочу разрешить.
Например:
// This class defines an interface that allows selected classes to
// manipulate otherwise private data.
class SharedData
{
public:
// Set some shared data.
virtual void SettorA(int value) = 0;
// Get some shared data.
virtual bool GettorB(void) const;
};
// This class does something with the otherwise private data.
class Worker
{
public:
void DoSomething(SharedData & data)
{
if (data.GettorB() == true)
{
data.SettorA(m_id);
}
}
private:
int m_id;
};
// This class provides access to its otherwise private data to
// specifically selected classes. In this example the classes
// are selected through a call to the Dispatch method, but there
// are other ways this selection can be made without using the
// friend keyword.
class Dispatcher
: private SharedData
{
public:
// Get the worker to do something with the otherwise private data.
void Dispatch(Worker & worker)
{
worker.DoSomething(*this);
}
private:
// Set some shared data.
virtual void SettorA(int value)
{
m_A = value;
}
// Get some shared data.
virtual bool GettorB(void) const
{
return (m_B);
}
int m_A;
bool m_B;
};
В этом примере SharedData - это интерфейс, который определяет, что можно сделать с данными, то есть что можно установить, а что только для получения. Worker - это класс, которому разрешен доступ к этому специальному интерфейсу. Dispatcher реализует интерфейс конфиденциально, поэтому доступ к экземпляру Dispatcher не дает вам доступа к специальным общим данным, но Dispatcher имеет метод, который позволяет работникам получать доступ.