Мой вопрос довольно прост. Я изучаю функции друзей, но по какой-то причине это не работает. Это только слова, если я поменяю класс экрана с классом Window_Mgr, а затем добавлю предварительное объявление класса экрана. Разве это не работает, потому что экран не знает о существовании «Переместить» в тот момент?
class Window_Mgr;
class screen
{
public:
typedef string::size_type index;
friend Window_Mgr& Window_Mgr::relocate(int, int, screen&);
private:
int width, height;
};
class Window_Mgr
{
public:
Window_Mgr& relocate(int r, int c, screen& s);
private:
};
Window_Mgr& Window_Mgr::relocate(int r, int c, screen& s)
{
s.height=10;
s.width=10;
};
int main(int argc, char* argv[])
{
system("pause");
}
Вы должны определить класс Window_Mgr
ДО screen
потому что в вашем коде компилятор не может убедиться, что Window_Mgr
действительно имеет функцию-член с именем relocate
ИЛИ ты просто врешь. Компилятор анализирует файл сверху вниз, и на пути вниз его задача — убедиться, что каждое объявление является фактом, а не ложью!
поскольку relocate()
принимает параметр типа screen&
, вы должны предоставить предварительную декларацию screen
вместо!
С этими исправлениями (и вместе с другими незначительными) этот код компилирует нормально сейчас (игнорируйте глупые предупреждения).
Да, Window_Mgr::relocate
неизвестно во время объявления друга. Вы должны определить Window_Mgr
заранее.