【发布时间】:2020-11-19 00:10:42
【问题描述】:
我在第一个a.cpp中定义了struct A。
// a.cpp
#include"a.h"
struct A {
A(int num):a(num){}
int a;
};
A obj{1};
A* obj_ptr = &obj;
在标题中,我做了 A 的前向声明和 obj_ptr 的声明:
// a.h
struct A;
extern A* obj_ptr;
然后我想在另一个名为 b.cpp 的 cpp 文件中使用 obj,但编译器报告错误:无效使用不完整类型“struct A”
// b.cpp
#include<iostream>
#include"a.h"
int main(){
std::cout << obj_ptr->a << std::endl;
}
解决的一种方法是将A的定义从a.cpp移到a.h,但是我想知道是否还有其他方法可以解决它?
【问题讨论】:
-
不行,没有别的办法。
-
你想要一个不透明的指针,还是不要?如果你这样做,那么你不能引用它。如果你不这样做,那么将声明放在标题中,这样你就可以......
-
好吧,“b.cpp”只看到前向声明,所以它没有它需要的所有信息
-
@Yushin Liu 要使用这个表达式 obj_ptr->a 编译器需要知道结构体 A 的定义。将结构体定义放在头文件中,并包含在 main 模块中。
标签: c++ struct scope definition compilationunit