2016-02-09 1 views
0

Как избежать #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(); 
}; 
+0

Почему вы спрашиваете, как избежать этого, когда * не * избегая этого ответа? – EJP

ответ

0

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

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

0

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

+0

Однако выполнение этого добавляет накладные расходы, поскольку результирующие объекты должны выделяться отдельно в куче, а не просто быть частью объекта «Ray». –

Смежные вопросы