¿Por qué no se anticipa la declaración de trabajo de clase cuando la clase se incluye en otra clase?

Esto compila

#include "Sprite.h"

class GameObject
{
  public:
      int x, y, w, h;
      Sprite sprite;
  public:
    GameObject();
    GameObject(int _x, int _y, int _w, int _h);
    virtual ~GameObject();
};

Esto no

class Sprite;

class GameObject
{
  public:
      int x, y, w, h;
      Sprite sprite;
  public:
    GameObject();
    GameObject(int _x, int _y, int _w, int _h);
    virtual ~GameObject();
};

Sé que podría reenviar la declaración y usar el puntero para Sprite, pero por qué la declaración de reenvío no funciona aquí. No "clasifica Sprite"; dice que existe Sprite? Estoy intentando #incluir tantas clases en .cpp y evitarlo en .h a toda costa. Además, las clases no se incluyen entre sí, por lo que no es necesario usar Sprite *. Supongo que no entiendo qué declarar hacia adelante es incorrecto o algo así porque no veo una razón por la cual esto no funciona.

Gracias por adelantado.

Respuestas a la pregunta(3)

Su respuesta a la pregunta