работа класса с другим классом(С++, ООП)

Почему когда класс Apple находиться выше класса Human, то показывает ошибку, а когда класс Human i класс Apple поменять местами, то всё работает? Подскажите, пожалуйста, знатоки ООП;)

#include <iostream>
#include <string>

using namespace std;

class Apple;
class Human;


class Apple
{
public:
  Apple(int weight, string color)
  {
    this->weight = weight;
    this->color = color;
  }
  friend void Human::EatHalfApple(Apple& apple);
private:
  int weight;
  string color;
};

class Human
{
public:
  void EatHalfApple(Apple& apple);
};

void Human::EatHalfApple(Apple& apple)
{
  apple.weight /= 2;
  cout << apple.weight << endl;
}

int main()
{
  Apple apple(145, "RED");
  Human John;
  John.EatHalfApple(apple);
  return 0;
}

Ответы (1 шт):

Автор решения: Harry

Потому что в классе Apple есть

friend void Human::EatHalfApple(Apple& apple);

Но к этому моменту компилятор знает только о том. что есть такой класс - Human - это вы ему объяснили... но вот что внутри него есть, в частности, есть ли метод EatHalfApple - ему неизвестно, проверить он этого не в состоянии - вот и сообщает об ошибке.

Если же поменять их местами - то

void EatHalfApple(Apple& apple);

ошибки не вызывает, так как компилятору известно, что такой класс - Apple - есть, а что внутри него или каков его размер - в этом объявлении неважно.

→ Ссылка