天天看點

執行個體了解c++中向前聲明與引用頭檔案的差別

使用C++程式設計,編譯時經常出現這種錯誤"error: invalid use of incomplete type ‘class xxx’",或“error: forward declaration of ‘class xxx’”. 解決這種錯誤就是用了解c++中向前聲明與引用頭檔案的差別。

  • 使用方式一:

    class B;

    class A{

    public:

    B b;

    };

    class B{

    public:

    A a;

    };

    在上面的寫法中,編譯就回出現上面的錯誤。因為對象b無法預知。解決方法如下:

    class B;

    class A{

    public:

    B *b;

    };

    class B{

    public:

    A *a;

    };

    因為指針這一資料類型的大小是特定的,編譯器可以獲知.

  • 使用方式二:

    class B;

    class A:public B

    {

    };

    class B{

    };

    這種方式也會出現編譯錯誤,解決如下:

    #include “B.h”;

    class A:public B

    {

    };

    file B.h:

    class B{

    };

    類的繼承需要使用頭檔案而不能使用向前聲明。

  • 前置聲明的使用:

      前置聲明隻能使用于 指針、引用、函數形參、函數傳回值。如果用于類内部的成員變量的聲明,類的繼承清單、模闆的參數都是非法的。

      前置聲明,可以節約預處理器的展開時間,也就是在編譯的時候速度是增快了,但是伴随着很多坑。

  • 總結

    原則一: 如果可以不包含頭檔案,那就不要包含,這時候前置聲明可以解決問題,如果使用的僅僅是一個類的指針,沒有使用這個類的具體對象(非指針),也沒有通路到類的具體成員,那麼前置聲明就可以了,因為指針這一資料類型的大小是特定的,編譯器可以獲知.

    原則二: 盡量在CPP檔案中包含頭檔案,而非在頭檔案中假設類A的一個成員是是一個指向類B的指針,在類A的頭檔案中使用了類B的前置聲明并便宜成功,那麼在A的實作中我們需要通路B的具體成員,是以需要包含頭檔案,那麼我們應該在類A的實作部分(CPP檔案)包含類B的頭檔案而非聲明部分(H檔案).

繼續閱讀