类定义在cpp中,但遇到错误:无效使用了不完整的类型



我在第一个中的.cpp中定义了结构体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,但编译器报告了错误:无效使用不完整类型"结构A";

// b.cpp
#include<iostream>  
#include"a.h"                                                                                           

int main(){         
std::cout << obj_ptr->a << std::endl;
} 

解决这个问题的一种方法是将A的定义从A.pp移动到A.h,但我想知道是否还有其他方法可以解决这个问题?

修复它的一种方法是将A的定义从A.pp移动到A.h,但我想知道是否还有其他方法可以修复它?

否。

我说不,但我的意思是,这很可能是最明智的解决方案。

理论上,您可以将main的定义移动到.cpp中,或者将类定义复制到b.cpp中。这些都可以,但它们适合您的设计吗?可能不会,但我们不能知道。

要在主中正确编译此语句

std::cout << obj_ptr->a << std::endl;
^^^^^^^^^^

(更确切地说是带下划线的表达式(编译器需要知道指针obj_ptr所指向的对象的结构定义。否则,它将无法确定什么是a

将结构定义放在页眉中,并将页眉包含在需要完整结构定义的每个模块中。

修复它的一种方法是将A的定义从A.cpp移动到A.h,但我想知道是否还有其他方法可以修复它?

没有其他方法可以向编译器提供结构的定义,而不将定义放在需要的每个编译单元中。每个编译单元独立于其他编译单元进行编译。

相关内容

最新更新