C++ 前置定義 Forward declaration
C++ 前置定義 Forward declaration
在編寫相對大型的CPP工程的時候,往往我們會遇到一個情況,即:
// A.hpp
#include "B.hpp"
class A{
};
// B.hpp
#include "A.hpp"
class B{
};
這往往會觸發編譯器的報錯。為了解決這種迴圈引用標頭檔案的問題,我們可以使用c++的前置引用(forward declaration)。
// A.hpp
class B; // ** forward declaration **
class A{
};
// B.hpp
#include "A.hpp"
class B{
};
我們選擇在相對比較基礎的標頭檔案中使用前置定義,定義出 class B
, 這可以簡單理解為, 當編譯器在處理A.hpp
的時候我們告訴了編譯器,這個B
雖然沒有出現在當前檔案的include
裡面,但是它之後會被建立。
Note
使用前置定義的時候也有需要注意的地方,分為以下幾點。
假設我們使用前置定義宣告瞭一個class
, 通常我們稱這個類為incomplete type
class X;
可以的操作有:
What you can do with an incomplete type:
-
作為成員型別,注意 此處只能宣告指標或者引用:
class Foo { X *p; X &r; };
-
定義函式,作為形參或者返回型別, 注意這裡的函式定義,與下面的函式宣告的區別,只有型別:
void f1(X); X f2();
-
使用該型別的指標或者引用:
void f3(X*, X&) {} X& f4() {} X* f5() {}
What you cannot do with an incomplete type:
-
作為基類
class Foo : X {} // compiler error!
-
作為成員型別,宣告成員變數(因為我們不知道該型別的具體大小,記憶體分佈):
class Foo { X m; // compiler error! };
-
定義該型別的返回值或者形參, 這裡與上面的不同在於實現了 函式體。這往往會涉及到該型別的 拷貝建構函式 或者 賦值建構函式。
void f1(X x) {} // compiler error! X f2() {} // compiler error!
-
使用該型別的方法,或者成員變數。
class Foo { X *m; void method() { m->someMethod(); // compiler error! int i = m->someField; // compiler error! } };
相關文章
- 作用域(scope), 定義空間(declaration space) 和 生存期(lifetime)
- Declaration vs. Definition of a variable in C(在c中,什麼是宣告什麼是定義)
- C++學習 類定義(一)C++
- C++中巨集定義#define的用法C++
- c++繼承,隱藏(重定義)C++繼承
- C++ forward_list 中插入和刪除操作C++Forward
- c/c++ 標準容器 forward_list resize 操作C++Forward
- C++入門教程(12):定義函式C++函式
- Nginx代理設定 Host 和 X-Forward-ForNginxForward
- C++教程-----C++變數型別和變數的定義C++變數型別
- [C++]變數宣告與定義的規則C++變數
- C++ 定義靜態成員 static 關鍵字不能在定義出重複出現C++
- C++定義函式指標,回撥C#C++函式指標C#
- C++ | VS2017 C++專案配置使用的常見巨集定義C++
- C++中過載、重寫、重定義的區別C++
- C++ inline和constexpr函式可以多次定義問題C++inline函式
- C++中什麼時候用move,什麼時候用forward?C++Forward
- 關於C++類的定義和物件的建立詳解C++物件
- C++ 開發 PHP 7 擴充套件之原生常量定義C++PHP套件
- 在定義C++, C通用介面函式時讓C++介面支援預設引數C++函式
- jsp forward 指令JSForward
- history.forward()Forward
- 學會在 C++ 中使用變數:從定義到實踐C++變數
- C++中使用巨集定義來註釋掉所有的cout輸出C++
- kubectl port-forwardForward
- Angular 2 Forward ReferenceAngularForward
- C++未定義行為C++
- 需求定義
- Springbean定義SpringBean
- 巨集定義
- no declaration can be found for element rabbit:connection-factory
- vue3 Could not find a declaration file for moduleVue
- implicit declaration of item ‘write’; did him mean ‘fwrite’?
- kubectl port-forward 指令Forward
- pytorch中forward的理解PyTorchForward
- CentOS 7 named配置forwardCentOSForward
- 定義製造業操作(定義 MES/MOM 系統)
- VueX Vue: Could not find a declaration file for module vuex.Vue