【问题标题】:Class definition in cpp but meet error: invalid use of incomplete typecpp中的类定义但遇到错误:不完整类型的无效使用
【发布时间】: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


【解决方案1】:

在main中正确编译这条语句

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    没有。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2016-12-21
      • 2017-10-24
      • 1970-01-01
      • 2010-10-13
      相关资源
      最近更新 更多