次のようにヘッダーで定義されたクラスがあります(省略):
class CairoRenderer
{
public:
CairoRenderer();
~CairoRenderer();
...
protected:
cairo_t* m_context;
cairo_surface_t* m_surface;
};
cairo_t と cairo_surface_t は、Cairoグラフィックス ライブラリによって定義された型です。
私が抱えている問題は、このクラスまたは別のライブラリまたはアプリケーションから派生したクラスを使用する場合、CairoRenderer ヘッダーを介して cairo 型を「リーク」しているため、cairo ヘッダーも含める必要があることです。同じライブラリ内のこのクラス (またはそのサブクラス) を、cairo ヘッダーをインクルードしたり、cairo ライブラリにリンクしたりする必要なく、外部で使用できるようにしたいと考えています。
次に試したのは、ウィキペディアの例に従って pimpl 手法を使用することでした。達成したいことができるように見えたからです。
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'
私はにきびを間違っていますか?それとも私がやりたいことは可能ですか?