簡體   English   中英

Class 在 cpp 中定義但遇到錯誤:不完整類型的無效使用

[英]Class definition in cpp but meet error: invalid use of incomplete type

我首先在 a.cpp 中定義了結構 A。

       // a.cpp
       #include"a.h"
       struct A {                                                                                                       
           A(int num):a(num){}
           int a;
       };
         
       A obj{1};
       A* obj_ptr = &obj;
        

在 header 中,我做了 A 的前向聲明和 obj_ptr 的聲明:

   // a.h
   struct A;                                                                                                        
   extern A* obj_ptr;

然后我想在另一個名為 b.cpp 的 cpp 文件中使用 obj,但編譯器報告錯誤:invalid use of incomplete type "struct A"

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

修復它的一種方法是將 A 的定義從 a.cpp 移動到 ah,但我想知道是否還有其他方法可以修復它?

要在 main 中正確編譯此語句

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

(更准確地說是帶下划線的表達式)編譯器需要知道指針obj_ptr指向的 object 的結構定義。 否則將無法確定什么a .

將結構定義放在 header 中,並在需要完整結構定義的每個模塊中包含 header。

修復它的一種方法是將 A 的定義從 a.cpp 移動到 ah,但我想知道是否還有其他方法可以修復它?

如果不將定義放在需要的每個編譯單元中,就沒有其他方法可以向編譯器提供結構的定義。 每個編譯單元都是獨立於其他編譯單元編譯的。

修復它的一種方法是將 A 的定義從 a.cpp 移動到 ah,但我想知道是否還有其他方法可以修復它?

不。

好吧,我說不,但我的意思是這是最有可能的最明智的解決方案。

理論上,您可以將main的定義移動到 a.cpp 中,或者將 class 定義復制到 b.cpp 中。 這些都可以,但它們適合您的設計嗎? 可能不是,但我們無法知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM