[英]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.