Каждый класс (A и B) должен иметь заголовочный файл и файл реализации.
Каждый файл заголовка (например, A.h
) не должен включать в себя другой файл заголовка (например, B.h
), но может включать прямую ссылку на другой класс (например, выражение типа class B;
) и может затем использовать указатели и / или ссылки на другой класс в его объявлении (например, class A
может содержать B*
в качестве члена данных и / или в качестве параметра метода).
Каждый файл CPP (например, A.cpp
) может включать в себя более одного файла заголовка (например, A.h
и B.h
). Рекомендуется, чтобы каждый файл CPP сначала включал собственный заголовочный файл (например, A.cpp
должен включать A.h
, а затем B.h
, тогда как B.cpp
должен включать B.h
, а затем A.h
).
Каждый заголовочный файл должен содержать только объявление, а не определение класса: например, он будет перечислять сигнатуры методов класса, но не тела / реализации метода (тела / реализации метода будут находиться в .cpp
файл, отсутствующий в заголовочном файле). Поскольку заголовочные файлы не содержат подробностей реализации, они поэтому не зависят (не должны видеть) подробностей других классов; самое большее, им нужно знать, что, например, B
- это имя класса: которое он может получить из прямого объявления, вместо включения заголовочного файла в другой заголовочный файл.