我在这样的标题中定义了一个类(缩写):
class CairoRenderer
{
public:
CairoRenderer();
~CairoRenderer();
...
protected:
cairo_t* m_context;
cairo_surface_t* m_surface;
};
cairo_t 和 cairo_surface_t 是由Cairo图形库定义的类型。
我遇到的问题是,如果我想使用这个类或其来自另一个库或应用程序的派生类,我还需要包含 cairo 标头,因为我通过 CairoRenderer 标头“泄漏”了 cairo 类型。我希望同一个库中的此类(或其任何子类)可以在外部使用,而无需包含 cairo 标头或链接到 cairo 库。
所以接下来我尝试的是按照Wikipedia示例使用 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'
我做错了吗?还是我想做的甚至可能?