[英]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.