Вы можете обойти это, используя предварительные объявления;на самом деле, вы должны предпочесть, чтобы они включали заголовки в большинстве случаев.
Когда заголовку не нужно знать о любых деталях реализации другого класса, вы можете использовать форварддекларация для него, вместо включения полного определения класса.По сути, это говорит компилятору: «Есть класс с этим именем», но больше ничего.
// This is a forward declaration. It tells the compiler that there is a
// class named Player, but it doesn't know the size of Player or what functions
// it has.
class Player;
struct Piece {
// This is just a pointer to player. It doesn't need to know any details about
// Player, it just needs to know that Player is a valid type.
boost::weak_ptr<Player> player;
};
Как правило, если файл передает только указатель или ссылку на определенный тип, этот тип долженбыть вперед объявлен.Однако, если он попытается фактически использовать объект этого типа, это приведет к ошибке компилятора.В этом случае вам необходимо включить соответствующий заголовок.
В большинстве случаев вы захотите включить заголовки для любых объявленных вперед классов в исходном файле, чтобы вы могли фактически использовать объекты, на которые указывают.