1. 程式人生 > >c++——前向宣告

c++——前向宣告

在C++中有一種使用其他類的方式:前向宣告。這個的用法和#include一個頭檔案的方式很像,但是兩者的使用有很大的區別:

前向宣告以及#include標頭檔案兩者區別:

前向宣告指在A程式中引入新的型別B,但是B並不是一個完整清晰的類,因為我們只知道只是一個B類,但是我們不清楚它的具體函式介面實現以及成員變數;不能定義一個B的型別,只能使用指標和引用的方式;直到後面找到B的定義我們才真正直到B的具體實現,才可以呼叫它的實現方式;

如果直接在程式中#include則可以直接定義這個類;

前向宣告的使用場景以及限制

看起來好像直接新增標頭檔案的方式挺好,提供了全部的介面,但是這樣的代價就是增加了編譯器的編譯工作量,大量匯入的標頭檔案會引起編譯比較慢;並且在兩方迴圈呼叫的情況下,比如A和B相互呼叫對方,在A呼叫B類相關的時候,B類可能還沒有定義好,那麼我們只能進行前向引用,只表明這是B類就好了;

限制情況:

1、不能夠定義B類的物件;

2、只可使用這個類的指標以及引用型別;

3、用於宣告使用型別為形參或者返回型別的函式;

使用示範:

1、通過前向引用減少標頭檔案的匯入,提供編譯的效率;

//A類的標頭檔案

class B;
class A {
    A();
    ~A();
    B* func(B&);
}


//A類的cpp檔案
#include "A.h"
#include "B.h"

//直接在程式碼中使用B類的物件以及成員函式、成員變數;

2、避免使用錯誤,以下還是按照上面的例子來實現

//A類的標頭檔案

class B;
class A {
    A();
    ~A()
    {
        if (B_obj != NULL)
        {
            delete B_obj;
            B_obj = NULL;
        }
    };
    B* func(B&);

    B* B_obj;
}


//A類的cpp檔案
#include "A.h"
#include "B.h"

//直接在程式碼中使用B類的物件以及成員函式、成員變數;

在上面的呼叫中就會出現問題了,解構函式delete B的物件,但是此時這個物件只是個空殼,我們並不知道具體B的定義,因此會呼叫失敗,出現警告:deletion of pointer to incomplete type 'B_obj'; no destructor called(沒有實踐)

參考引用: