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! } };
相關文章
- C++巨集定義#defineC++
- C++ 宣告與定義C++
- C++學習 類定義(一)C++
- c++繼承,隱藏(重定義)C++繼承
- C++中巨集定義#define的用法C++
- c/c++標準預定義巨集C++
- 在C++ Builder中定義事件 (轉)C++UI事件
- c/c++ 標準容器 forward_list resize 操作C++Forward
- C++入門教程(12):定義函式C++函式
- c++介面定義及實現舉例C++
- C++中類及類的定義 (轉)C++
- C++教程-----C++變數型別和變數的定義C++變數型別
- C/C++—— C++中定義虛解構函式的原因C++函式
- 一個C++巨集定義與列舉定義重複的編譯錯誤C++編譯
- ForwardForward
- [C++]變數宣告與定義的規則C++變數
- C++ 之預定義型別 IO 格式控制C++型別
- 【C++】為什麼不能定義陣列的引用,卻可定義變數的引用C++陣列變數
- 【C++注意事項】2 變數宣告和定義C++變數
- C++中過載、重寫、重定義的區別C++
- c++中模板_類别範本的宣告和定義C++
- golang expected declaration, found 'IDENT'GolangIDE
- C++ | VS2017 C++專案配置使用的常見巨集定義C++
- C++中什麼時候用move,什麼時候用forward?C++Forward
- history.forward()Forward
- C++ 開發 PHP 7 擴充套件之原生常量定義C++PHP套件
- 關於C++類的定義和物件的建立詳解C++物件
- 【C++】函式返回函式指標的多種定義方式C++函式指標
- 【C++】函式返回資料指標的多種定義方式C++函式指標
- 教你看懂C++類庫函式定義之一---HRESULT 巨集C++函式
- C++型別轉換時定義非成員函式(轉)C++型別函式
- 在定義C++, C通用介面函式時讓C++介面支援預設引數C++函式
- C/C++語言巨集定義##連線符和符#的使用C++
- 學會在 C++ 中使用變數:從定義到實踐C++變數
- c++中&含義C++
- jsp forward 指令JSForward
- Angular 2 Forward ReferenceAngularForward
- forward_list例子Forward