漏出外部I型具有在報頭中定義像這樣(縮寫)的類:避免在C++類
class CairoRenderer
{
public:
CairoRenderer();
~CairoRenderer();
...
protected:
cairo_t* m_context;
cairo_surface_t* m_surface;
};
cairo_t和cairo_surface_t是由Cairo圖形庫定義的類型。
我遇到的問題是,如果我想從另一個庫或應用程序使用此類或其派生類,我需要包含cairo標頭,因爲我通過CairoRenderer標頭「泄漏」開羅類型。我希望在同一個庫中的這個類(或它的任何子類)可以在外部使用,而不需要在開羅庫中包含cairo頭或鏈接。
所以,我想未來的事情是使用平普爾技術爲每Wikipedia例子,因爲它看起來像它會做什麼,我想實現:
CairoRenderer.h(略)
class CairoRenderer
{
...
protected:
struct CairoRendererImpl;
CairoRendererImpl* m_pimpl;
};
CairoRenderer.cpp(略)
#include "CairoRenderer.h"
#include "cairo.h"
....
struct CairoRenderer::CairoRendererImpl
{
public:
CairoRendererImpl() : m_surface(NULL), m_context(NULL) { }
~CairoRendererImpl()
{
cairo_surface_destroy(m_surface);
cairo_destroy(m_context);
}
void Initialize(cairo_t* context, cairo_surface_t* surface)
{
m_context = context;
m_surface = surface;
}
cairo_surface_t* surface() { return m_surface; }
cairo_t* context() { return m_context; }
private:
cairo_surface_t* m_surface;
cairo_t* m_context;
};
CairoRenderer::CairoRenderer() : m_pimpl(new CairoRendererImpl()) { ... }
CairoRenderer::~CairoRenderer() { delete m_pimpl; }
我的問題是,當我嘗試從一個派生類訪問m_pimpl成員,我得到的編譯器錯誤:
error C2027: use of undefined type 'CairoRenderer::CairoRendererImpl'
我在做pimpl錯了嗎?或者,我甚至想做甚麼?
你想從一個派生類訪問PIMPL爲什麼呢? pimpl的整個存在的目的是隱藏一個類的實現細節。如果有的話,派生類應該只使用基類的接口。 – wilhelmtell
主要目標是從外部代碼隱藏cairo_t和cairo_surface_t。 Pimpl看起來像解決方案,但顯然不是 – jumpinjackie