C++ 在 .h 文件中转发声明结构并在 .cpp 文件中定义结构

标签 c++

我希望在 header 中转发声明一个结构,然后在源文件中隐藏实现。

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"

如何在 header 中声明结构,然后在源代码中定义它? MyStruct 继承自其他结构非常重要。我想隐藏尽可能多的实现细节。

最佳答案

您可以使用指向该结构的指针。但是,您不能使用 MyStruct 类型的值,因为编译器在没有结构定义的情况下不知道结构的大小/布局。由于结构定义隐藏在 .cpp 文件中(因此当编译器处理 main.cpp 时不“可见”):

MyStruct* structTest;

在 main.cpp 中是允许的,而

 MyStruct structTest;

不是。此外,类似:

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

如果放在main.cpp中,也不会编译,出于同样的原因。您应该将结构定义放在 header 中,或者使用 PIMPL,正如其他评论者之一指出的那样。

关于C++ 在 .h 文件中转发声明结构并在 .cpp 文件中定义结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21022018/

相关文章:

c++ - 用于分析和减少我的应用程序编译时间的 GNU 工具

c++ - Xcode 错误 : "2 duplicate symbols for architecture x86_64"

c++ - 将图像颜色从灰度转换为 RGB OpenCV C++

c++ - OOP 图形用户界面,模板 C++

c++ - STL练习题

c++ - 在固定的、无序的、拥有的数组中安全、惯用的销毁和压缩

C++ 隐式函数调用

c++ - C++ 中的垃圾收集——为什么?

c++ - 解决外部库缺乏常量正确性的问题

c++ - 具有模板类的函数模板特化