Вы объявляете экземпляр Person
в заголовочном файле вашего транспортного средства, поэтому компилятору требуется полное объявление. Если вы используете указатель или ссылку на человека, вы можете просто объявить его с помощью class Person;
.
РЕДАКТИРОВАТЬ: Кроме того, возьмите это using namespace std;
и префикс ваших переменных с std::
. Это спасет от болей в будущем.
EDIT2: Вам также нужно включить <string>
в заголовочный файл.
Хорошо, здесь я собираюсь постараться сделать это просто и красиво.
Когда ваш компилятор обрабатывает ваши файлы реализации (.cpp), он включает указанные вами заголовки (в данном случае это будут vehicle.h
и person.h
). Для каждого файла реализации компилятору необходимо знать о каждом используемом вами типе, чтобы он мог генерировать правильный код.
Когда он обрабатывает включаемый файл, ему все равно нужно знать все . Таким образом, в вашем заголовочном файле vehicle.h
вы используете Person
. В тот момент, когда компилятор достигнет этого, он должен знать, как создать человека. Ваш vehicle.cpp
включает person.h
до vehicle.h
, так что никаких проблем. ЗА vehicle.cpp
. Все, что включает vehicle.h
, но не включает person.h
, вызовет ошибки компиляции.
Так, когда вы можете избежать предварительного объявления и указать указатель или ссылку?
Объявление указателя или ссылки не требует от компилятора каких-либо сведений об этом классе или структуре в заголовочном файле. Вы просто говорите компилятору, что у вас есть намерение сделать это. При условии, что класс заранее объявлен так:
class Person;
Тогда компилятор говорит: «Окей, я возьму это». Затем вы включаете соответствующий файл в свою реализацию, компилятор понимает, что вы имеете в виду, и все с радостью возвращаются домой из бара.
В вашем случае, я думаю, произошло то, что файл реализации для транспортного средства выглядит хорошо на бумаге, но что-то еще включает vehicle.h
и нет никакой подсказки о том, что такое Person
.
Ваше решение
Либо включите person.h
в vehicle.h
, если необходимо, в противном случае измените конструктор так, чтобы он ссылался на персона (и участника), и перешлите объявление Person
. Однако, не зная, что делает ваша программа, я не могу сказать, что даже передача по ссылке верна.
И, пожалуйста, удалите using namespace std;
и измените string
на std::string
:)