Ваш подход в данном случае кажется вполне подходящим.
Следует помнить одну вещь, когда заголовки включают другие заголовки, - вам может потребоваться включить включающий охрану:
// At the start of Tires.h:
//
// Only delcare this stuff if this is the first time including Tires.h:
//
#ifndef __myproject_Tires_h__
#define __myproject_Tires_h__
class Tires
{
// [snip]
};
// Close the #ifdef above...
//
#endif
Это не позволяет вам объявить "class Tire {
" и др.несколько раз, если Tires.h
окажется включенным дважды.
Другое - то, что эта строка в Car.h
не нужна:
class Tires;
Это может быть полезно, если вы хотите иметьдекларации Tires*
или Tires&
, но чтобы сделать то, что вы сделали дальше:
class Car
{
private:
Tires tires;
... требует, чтобы Tires
был "полным типом", чтобы его размер был известен, и т. д.Вы уже покрыли это наличием #include "Tires.h"
в любом случае.
Наконец, некоторые считают плохой формой иметь выражение using
внутри заголовка, как вы это сделали.Этот вид разбивает пространства имен, вводя std
в качестве глобального пространства имен для всех файлов, которые используют этот заголовок.Представьте, что каждый заголовок делал это и делал это для нескольких пространств имен.В конце концов это становится таким же, как отсутствие таких вещей, как пространства имен, и вероятнее всего столкновения.