0

我首先在 a.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,但编译器报告错误:无效使用不完整类型“struct A”

    // b.cpp
    #include<iostream>  
    #include"a.h"                                                                                           
                        
    int main(){         
        std::cout << obj_ptr->a << std::endl;
    } 

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

4

2 回答 2

0

要在 main 中正确编译此语句

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

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

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

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

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

于 2020-07-29T12:01:42.713 回答
0

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

不。

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

理论上,您可以改为将定义移动main到 a.cpp,或将类定义复制到 b.cpp。这些会起作用,但它们是否适合您的设计?可能不会,但我们无法知道。

于 2020-07-29T12:04:36.573 回答