2014-01-09 7 views
1

Я ищу, чтобы переслать объявление структуры в заголовке, а затем скрыть реализацию в исходном файле.C++ Forward Объявить структуру в файле .h и определить структуру в файле .cpp

mystruct.h

... 

struct MyStruct; 

... 

mystruct.cpp

#include <mystruct.h> 
... 

struct MyStruct : virtual SomeOtherStruct, virtual AndAnotherStruct {}; 

... 

Однако, когда я пытаюсь создать экземпляр MyStruct:

main.cpp

#include <mystruct.h> 
... 

MyStruct structTest; 

... 

Я получаю ошибку

"error: aggregate 'MyStruct structTest' has incomplete type and cannot be defined"

Как я могу объявить структуру в заголовке, а затем определить ее позже в источнике? Важно, что MyStruct наследуется от других структур. Я хотел бы скрыть как можно больше деталей реализации.

+2

Вы не можете этого сделать. 'main.cpp' должен иметь доступ к определению структуры. Вы можете скрыть реализацию, используя идиом * pimpl *. – juanchopanza

+0

Как компилятор мог узнать расположение объекта MyStruct в main.cpp? Помните, что только во время соединения разные единицы компиляции объединены, поэтому с точки зрения компилятора main.cpp полностью не связан с mystruct.cpp. – Roel

ответ

4

Вы можете использовать указатель на структуру. Однако вы не можете использовать значение типа MyStruct, потому что компилятор не знает размер/макет структуры без определения структуры. Поскольку определение структура скрыт в файле .cpp (и, таким образом, не «видно», когда компилятор обрабатывает main.cpp):

MyStruct* structTest; 

разрешено включать в main.cpp, в то время как

MyStruct structTest; 

нет. Кроме того, что-то вроде:

void foo() { 
    MyStruct* test; 
    test->someFunc(); 
} 

не будет компилироваться, если она помещается в main.cpp, по той же причине. Вы должны поместить определение структуры в заголовок или использовать PIMPL, как заметил один из других комментаторов.

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