Как избежать #include в файлах заголовков, когда предварительное объявление вызывает ошибку неполного типа?

Как избежать #include в файлах заголовков, когда предварительное объявление вызывает ошибку неполного типа?

Это мой заголовочный файл ray.h. Когда я реализую форвардное объявление, Vector превращается в неполный тип. В этом случае мне придется использовать #include в файле заголовка?

#include "vector.h"

struct Ray {
    Vector position, direction; // error: incomplete type when it uses forward declaration

    Ray();
    Ray(Vector position, Vector direction);
    ~Ray();
};

person Danilo    schedule 09.02.2016    source источник
comment
Почему вы спрашиваете, как этого избежать, если ответ - не?   -  person user207421    schedule 09.02.2016


Ответы (2)


Из-за способа определения структуры Ray каждый .cpp файл, который использует Ray, также должен будет знать Vector, поэтому, если у вас есть только предварительное объявление в ray.h, оно должно будет #include "vector.h" перед любым #include "ray.h". Это неудобно.

Поэтому для всех будет проще всего, если вы просто добавите #include "vector.h" к ray.h. Затем люди могут #include "ray.h" и начать использовать Ray, не требуя дополнительных #include.

person Adi Levin    schedule 09.02.2016

На самом деле есть способ избежать #include. Вы можете использовать Vector* (указатель на Vector) или std::unique_ptr<Vector> (что практически то же самое, но нет необходимости явно выделять \ освобождать поля).

person Eldar Dordzhiev    schedule 09.02.2016
comment
Однако это увеличивает накладные расходы, поскольку полученные объекты должны быть выделены отдельно в куче, а не просто быть частью объекта Ray. - person Pete Becker; 09.02.2016