У меня есть класс, определенный в заголовке следующим образом (сокращенно):
class CairoRenderer
{
public:
CairoRenderer();
~CairoRenderer();
...
protected:
cairo_t* m_context;
cairo_surface_t* m_surface;
};
cairo_t и cairo_surface_t - это типы, определенные в графической библиотеке Cairo .
У меня проблема в том, что если я хочу использовать этот класс или его производные классы из другой библиотеки или приложения, мне нужно также включить заголовки cairo, потому что я «пропускаю» типы cairo через заголовок CairoRenderer.Я хочу, чтобы этот класс (или любой его подкласс) в той же библиотеке можно было использовать извне, без необходимости включать заголовок cairo или ссылку на библиотеки cairo.
Поэтому следующее, что я попробовал, - это использование pimpl.техника в соответствии с примером 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?Или то, что я хочу сделать, даже возможно?