Учитывая следующий код:Почему я не могу объявить друга в одном классе, который является частным членом другого класса?
class Screen;
class WindowMgr
{
WindowMgr& relocateScreen(int r, int c, Screen& s);
};
class Screen
{
friend WindowMgr& WindowMgr::relocateScreen(int r, int c, Screen& s);
//^cannot access private member declared in class 'WindowMgr'
int m_nR,
m_nC;
};
WindowMgr& WindowMgr::relocateScreen(int r, int c, Screen& s)
{
s.m_nR = r;
s.m_nC = c;
return *this;
}
Почему может Screen
класс не объявлять функцию WindowMgr::relocateScreen
члена как друга? Screen
не хочет использовать эту частную функцию-член другого класса, но просто хочет, чтобы эта функция имела доступ к ее собственным частным членам.
Выполнение функции relocateScreen
может быть плохой дизайн, если он предназначен только для использования в классе WindowMgr
. Точно так же, делая Screen
, у друга WindowMgr
может быть плохой дизайн, если он не намерен обращаться к частным членам WindowMgr
в любом другом случае.
В каком месте я ошибаюсь? Каков правильный подход? Неужели я обманываю себя?
Передовая декларация уже существует. На самом деле, если бы я сделал класс Screen другом в WindowMgr, объявление класса Screen будет введено в окружающую область, явно удалив необходимость в прямом объявлении. – James