簡體   English   中英

使用命名空間隱藏內部類實現

[英]hiding inner class implementation using namespace

我正在開發一個庫,並希望為我的用戶提供一個公共接口,與隱藏在命名空間中的實際實現分開。 這樣,我只能更改HiddenQueue類而不更改僅向用戶公開的myQueue。

如果我將HiddenQueue的C ++代碼放在myQueue.cpp文件中,編譯器會抱怨說_innerQueue的類型不完整。 我認為鏈接器能夠解決這個問題。 我在這做錯了什么?

// myQueue.h
namespace inner{
    class HiddenQueue;
};

class myQueue{

public:
    myQueue();
);

private:

    inner::HiddenQueue _innerQueue;

};

///////////////////////////

// myQueue.cpp
namespace inner{
    class HiddenQueue{};
};

編譯器需要通過查看它定義的頭文件來了解對象的確切內存布局。

您的代碼表示,類MyQueue有一個類型的成員InnerQueue ,這將是內存布局的一部分MyQueue的對象。 因此,要推斷出MyQueue的內存布局,需要了解InnerQueue的內存布局。 它沒有,因為你說“哦,它在其他地方定義”。

您要做的是與“ PIMPL 習慣用法 ”/“編譯器防火牆”技術密切相關。

要解決此問題,您必須在標頭中包含HiddenQueue.h或將_innerqueue聲明為指針:

class myQueue {

public:
    myQueue();

private:

    inner::HiddenQueue* _pinnerQueue;
};

使用指針是可能的,因為指針具有已知的內存大小(取決於您的目標體系結構),因此編譯器不需要查看HiddenQueue的完整聲明。

為了能夠成為類的成員,您需要為其定義,而不僅僅是聲明。 (對於指針或對類的引用,聲明就足夠了)。

您需要提供指向_innetQueue的指針,而不是對象本身:

std::auto_ptr<inner::HiddenQueue> _innerQueue;

搜索表格pimpl ideom或d-pointer

暫無
暫無

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

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