2008-10-15 4 views
5

Una delle classi nel mio programma utilizza alcune librerie di terze parti. oggetto Library è un membro privato della mia classe:Intestazioni C++ - separazione tra interfaccia e dettagli di implementazione

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

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

Il problema di questo - qualsiasi altra unità nel mio programma che utilizza La mia classe dovrebbe essere configurato per includere 3p intestazioni. Passare a un altro tipo di 3p metterà a repentaglio l'intera build ... Vedo due modi per risolvere questo problema: uno è quello di rendere 3pObject extern e trasformare m_Object in un puntatore, inizializzato nel costruttore; in secondo luogo è quello di creare un "interfaccia" e classi "factory" ed esportarli ...

Potrebbe suggerire un altro modo per risolvere questo?

risposta

11

Utilizzare la "Pimpl" idioma:

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

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

Qualsiasi motivo per non utilizzare boost :: scoped_ptr? – grigy

+0

Niente di specifico - sono stato abituato a usare auto_ptr - probabilmente in questo caso è più appropriato usare scoped_ptr dato che non c'è trasferimento di proprietà –

13

L'attuazione privata (Pimpl) modello:

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

In sostanza, si definisce che la classe contiene un puntatore ad una struct che si dichiara in avanti. Quindi si definisce la struttura all'interno del file cpp e si utilizza il costruttore e il distruttore della classe per creare/eliminare PIMPL.

:)

0

Tutta la struttura interna di QT è fatto utilizzando classi di implementazione private.
Si può cercare un buon riferimento su come è fatto correttamente.