Надеюсь, я понял вашу застрявшую точку.
Чтобы объяснить это, лучше разобраться с точки зрения компилятора.
Компилятор делает для Car.h
:
- Заменяет
#include "Wheel.h"
его содержимым. - Заменяет
#include <vector>
его содержимым.
На этом шаге единица перевода для Car.h
выглядит следующим образом.
class Car;
class Wheel
{
Car* car;
};
// Vector implementation of the stl goes here
class Car
{
std::vector<Wheel> wheels;
};
На этом этапе в строке Car* car;
необходимо объявление class Car
(объявление достаточно для типов указателей) чтобы определить class Wheel
, поэтому вам нужно предварительное объявление, потому что вы должны сообщить компилятору, что существует class Car
, и он будет определен в ближайшее время.
Если вы закомментируете class Car
в строке 1, компилятор не сможет знать, будет ли class Car
или нет.
Насколько я знаю, существуют дополнительные ограничения, связанные с одним правилом определения , может быть, кто-то другой может объяснить это.
На данный момент невозможно найти «более элегантный» способ.