標籤:
引言:
有種特殊情況,當兩個類需要相互引用形成一個”環形“引用時,無法先定義使用。 這時候需要用到前向申明
但是前向申明的類不能執行個體化。
1 #pragma once 2 3 #include "B.h" 4 class A 5 { 6 public: 7 A(); 8 ~A(); 9 10 B b_;11 };
#pragma once#include "A.h"class B{public: B(); ~B(); A a_;};
兩個類互相包含編譯的提示錯誤為:
1 1>------ 已啟動產生: 項目: test, 配置: Debug Win32 ------2 1> B.cpp3 1>g:\cpp\代碼\test\test\a.h(10): error C2146: 語法錯誤: 缺少“;”(在標識符“b_”的前面)4 1>g:\cpp\代碼\test\test\a.h(10): error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支援預設 int5 1> A.cpp6 1>g:\cpp\代碼\test\test\b.h(9): error C2146: 語法錯誤: 缺少“;”(在標識符“a_”的前面)7 1>g:\cpp\代碼\test\test\b.h(9): error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支援預設 int8 1> 正在產生代碼...9 ========== 產生: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========
那麼什麼是前向申明呢?
#pragma once#include "A.h"class A; //前向申明class B{public: B(); ~B(); A a_; //不可執行個體化};
這樣仍然是錯誤的,因為前向申明是不可執行個體化的。
編譯提示:
1>------ 已啟動產生: 項目: test, 配置: Debug Win32 ------1> B.cpp1>g:\cpp\代碼\test\test\a.h(10): error C2146: 語法錯誤: 缺少“;”(在標識符“b_”的前面)1>g:\cpp\代碼\test\test\a.h(10): error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支援預設 int1> A.cpp1>g:\cpp\代碼\test\test\b.h(11): error C2079: “B::a_”使用未定義的 class“A”1> 正在產生代碼...========== 產生: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========
很簡單的處理,只需要使用指標即可。 經過實驗 引用也可。
1 #pragma once 2 #include "A.h" 3 4 class A; 5 class B 6 { 7 public: 8 B(); 9 ~B();10 11 A *a_;12 };
嵌套類:Demo
1 #include <iostream> 2 using namespace std; 3 4 5 class Outer 6 { 7 class Inner 8 { 9 public:10 void fun()11 {12 cout << "Inner:Fun...." << endl;13 }14 };15 16 public:17 Inner obj_;18 void fun()19 {20 cout << "Outer:fun..." << endl;21 obj_.fun();22 }23 24 };25 26 int main(void)27 {28 Outer o;29 o.fun();30 }
## 從範圍的角度看,嵌套類被影藏在外圍類中,該類名只能在外圍類中使用。如果在外圍類的範圍中使用該類名時,需要加名字限定;
##嵌套類中的成員函數可以再它的類體外定義;
##嵌套類的成員函數對外圍類的的成員沒有訪問權,反之亦然。
##嵌套類僅僅是文法上的嵌入
1 #include <iostream> 2 using namespace std; 3 4 5 class Outer 6 { 7 class Inner 8 { 9 public:10 void fun();11 };12 13 public:14 Inner obj_;15 void fun()16 {17 cout << "Outer:fun..." << endl;18 obj_.fun();19 }20 21 };22 void Outer::Inner::fun()23 {24 cout << "Inner:Fun...." << endl;25 }26 27 int main(void)28 {29 Outer o;30 o.fun();31 }
類體外申明只需要記住要加多個類名即可。
C++學習之路: 前向申明