簡體   English   中英

c ++我應該使用前向聲明嗎?

[英]c++ Should I use forward declaration?

我發現這個問題什么時候使用前向聲明? 這是有用的,但它是描述性的而不是規定性的。

我的場景通常是我使用指向另一個類的指針作為類成員或函數參數,所以我在標題中需要的只是一個前向聲明(另外,如果我切換到使用boost shared_ptr,它們將是與使用前向聲明兼容?)。 目前我只是包括標題,但現在我想知道我是否應該使用前向聲明。

所以我的問題是,如果我可以使用前瞻性聲明,我應該嗎? 我希望這個問題不是主觀的,但如果沒有最佳實踐答案,那么使用前瞻性聲明的利弊是什么?

UPDATE

只是為了擴展shared_ptr問題(我現在沒有使用它們,而是考慮切換)。 如果我要使用它們,我想我會在類中使用typedef的shared_ptr類型。 例如:

class Customer
{
public:
    typedef std::tr1::shared_ptr<Customer> SharedPointer;

    Customer() {}   
    virtual ~Customer() {}

    virtual std::string GetName() const;
};

似乎這可能會使事情變得更加混亂。 這會對前向聲明產生問題,如果是這樣,有一個簡單的解決方法嗎?

您可能希望這樣做,因為包含文件會使編譯時間更長,但根據您擁有的案例數量和代碼庫的大小,它很可能不會成為問題。

另一件需要考慮的事情是依賴關系。 您不希望重新編譯所有代碼,因為您更改了包含文件,而您只需要指針定義。

所以我的(主觀)答案是肯定的,你應該

是的你應該。 請記住,當您的代碼的客戶端使用它時,您還包括在標題中包含的任何內容。 最好只包含標頭中所需的最小文件數。 除此之外,如果您不需要包含整個文件並且前向聲明足夠,那么它似乎是一個簡單的選擇。

我認為最好使用前向聲明來提高編譯速度(不包括大量文件)使用共享指針的問題它不會改變任何東西,因為共享指針只是一個包裝器,負責清理堆內存

他們通常會說你應該盡可能使用前瞻聲明。 與所有規則一樣,此規則也有例外。 對我來說,例外情況通常是類型名稱過於復雜(即模板 ),或者名稱太多時。 例如,以下是前向聲明:

namespace foo
{
    namespace bar
    {
        template <typename T1, typename T2, int X>
        class MyNiftyType;
        // Hmm, maybe declare more types here?
    }
    // Hmm, maybe declare even more types here?
}

如果通過#include "MyNiftyStuff.h"可以避免這些東西,我會更好#include

BTW有一個標准頭文件<iosfwd> ,它包含某些流類型的前向聲明。 它似乎是專門發明的,所以你能夠聲明operator<<(std::ostream&, ...) (這是我的個人意見,對不起,如果它畢竟是錯的)。


編輯:關於shared_ptr<type>

粗略地說,你可以用共享指針(向前聲明的類型)做的唯一事情是聲明函數。 如果要定義一個對shared_ptr<type>執行某些有用操作的函數,則不能只是轉發聲明type 例如:

MyCode.h

class MyClass;
void DoMuchStuff(shared_ptr<MyClass> ptr); // declaration - OK
inline void DoDoubleStuff(shared_ptr<MyClass> ptr) // definition - not OK!
{
    void DoMuchStuff(ptr);
    void DoMuchStuff(ptr);
}

如果我使用普通指針而不是shared_ptr ,這將適用於前向聲明。 但是這種不便很少打擊你 - 要么你的.h文件中只有聲明,要么你的內聯函數足夠復雜,你必須#include你的課程的完整聲明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM