C++學習之路: 前向申明

來源:互聯網
上載者:User

標籤:

引言:

  有種特殊情況,當兩個類需要相互引用形成一個”環形“引用時,無法先定義使用。 這時候需要用到前向申明

但是前向申明的類不能執行個體化。

 

 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++學習之路: 前向申明

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.