Я с нетерпением жду, чтобы объявить структуру в заголовке, а затем скрыть реализацию в исходном файле.
mystruct.h
...
struct MyStruct;
...
mystruct.cpp
#include <mystruct.h>
...
struct MyStruct : virtual SomeOtherStruct, virtual AndAnotherStruct {};
...
Однако, когда я пытаюсь создать экземпляр MyStruct:
main.cpp
#include <mystruct.h>
...
MyStruct structTest;
...
Я получаю ошибку
«ошибка: агрегат» MyStruct structTest «имеет неполный тип и не может
быть определенным
Как я могу объявить структуру в заголовке, а затем определить ее позже в источнике? Важно что MyStruct
наследует от других структур. Я хотел бы скрыть как можно больше деталей реализации.
Вы можете использовать указатель на структуру. Однако вы не можете использовать значение типа MyStruct, потому что компилятор не знает размер / расположение структуры без определения структуры. Поскольку определение структуры скрыто в файле .cpp (и, следовательно, не «видно», когда компилятор обрабатывает main.cpp):
MyStruct* structTest;
разрешено в вашем main.cpp, тогда как
MyStruct structTest;
не является. Дополнительно что-то вроде:
void foo() {
MyStruct* test;
test->someFunc();
}
не будет компилироваться, если он помещен в main.cpp по той же причине. Вы должны поместить определение структуры в заголовок или использовать PIMPL, как заметил один из других комментаторов.
Других решений пока нет …