2008-10-15 17 views
5

Una de las clases de mi programa utiliza una biblioteca de terceros. Los objetos de biblioteca es un miembro privado de mi clase:encabezados de C++: separación entre la interfaz y los detalles de implementación

// My.h 
    #include <3pheader.h> 

    class My 
    { 
    ... 
    private: 
     3pObject m_object; 
    } 

El problema con esto - cualquier otra unidad en mi programa que utiliza mi clase debe ser configurado para incluir encabezados 3p. Pasar a otro tipo de 3p pondrá en peligro toda la compilación ... Veo dos formas de arreglar esto: una es hacer 3pObject extern y convertir m_Object en un puntero, inicializándose en constructor; segundo es crear una "interfaz" y clases de "fábrica" ​​y exportarlas ...

¿Podría sugerir otras formas de resolver eso?

Respuesta

11

uso del "pimpl" modismo:

// header 
class My 
{ 
    class impl; 
    std::auto_ptr<impl> _impl; 
}; 

// cpp 
#include <3pheader.h> 
class My::impl 
{ 
    3pObject _object; 
}; 
+0

Alguna razón para no usar boost :: scoped_ptr? – grigy

+0

Nada específico - He estado acostumbrado a usar auto_ptr - probablemente es más apropiado en este caso usar scoped_ptr ya que no hay transferencia de propiedad –

13

la implementación privada (PIMPL) patrón:

http://www.codeproject.com/KB/tips/PIMPL.aspx

Básicamente, se define que su clase contiene un puntero a una estructura que se declara hacia adelante. Luego defines la estructura dentro del archivo cpp y usas el constructor y el destructor en tu clase para crear/eliminar el PIMPL.

:)

0

Toda la estructura interna de QT se realiza mediante clases de implementación privados.
Puede buscar una buena referencia sobre cómo se hace correctamente.

Cuestiones relacionadas