2016-02-05 2 views
0

У меня есть структуры в моем файле CPP, который содержит определение двоеточия:Как определить структуру с наследованием в файле заголовка?

struct GeomMeshLoader: VRayStaticGeomSource, VRaySceneModifierInterface 
{ 
    <definitions> 
} 

Как мне определить эту структуру в заголовочном файле? Если я просто сделать:

struct GeomMeshLoader; 

тогда я буду получать во время компиляции другого файла CPP, включая этот заголовок:

allocation of incomplete type 'GeomMeshLoader' 

Если я объявляю заголовок вроде:

struct GeomMeshLoader: VRayStaticGeomSource, VRaySceneModifierInterface; 

затем его сбой в сборе с:

error: expected '{' after base class list 

Каков способ размещения описаний структуры заголовков, содержащих двоеточие?

+1

определение Colon? Чувак, это называется наследованием – Drop

ответ

3
allocation of incomplete type 'GeomMeshLoader' 

означает, у вас есть код, который пытается использовать этот тип в некотором роде, который должен увидеть полное определение (т.е. не только держит указатель или ссылку). Как он может выделить объект такого типа, если он не может определить размер объекта? Для этого он должен видеть весь класс: все базовые классы, все данные элемента.

Вам нужно будет поместить все определение класса в заголовок. Вы не можете перенаправить объявление и определить его в .cpp.

определение любых функций-членов (но не шаблонов функций-членов) все еще может быть в .cpp. Декларации этих функций-членов должны указываться в определении класса (в заголовке).

Итак:

// geomeshloader.h 
#ifndef INCLUDED_GEOMESHLOADER_H // Don't forget your header guards 
#define INCLUDED_GEOMESHLOADER_H 
struct GeomMeshLoader: VRayStaticGeomSource, VRaySceneModifierInterface { 
    int i_; 
    void foo() const; 
}; 
#endif 

и

// geomeshloader.cpp 
#include "geomeshloader.h" 
void GeoMeshLoader::foo() const 
{ 
    // do stuff 
} 
+0

Спасибо, но когда я поместил все определение структуры в заголовок (который входит в состав нескольких cpp), я получаю дублируемую ошибку объекта при связывании. Как я могу предотвратить это? –

+0

[Защитники заголовка] (https://en.wikipedia.org/wiki/Include_guard) перестает копировать ваше определение в несколько раз в единую единицу перевода (т. Е. Просматривается более одного раза в одном файле '.cpp'). – BoBTFish

+0

Он отлично работает, спасибо! –

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