2008-10-15 6 views
5

Eine der Klassen in meinem Programm verwendet eine Bibliothek von Drittanbietern. Bibliotheksobjekt ist ein privates Mitglied meiner Klasse:C++ - Header - Trennung zwischen Schnittstelle und Implementierungsdetails

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

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

Das Problem dabei - jede andere Einheit in meinem Programm, dass meine Klasse verwendet, sollte enthalten 3er-Header konfiguriert werden. Das Verschieben auf eine andere Art von 3p wird den gesamten Build gefährden ... Ich sehe zwei Möglichkeiten, um dies zu beheben - man soll 3pObject extern machen und m_Object in einen Zeiger verwandeln, der im Konstruktor initialisiert wird; Zweitens ist es, eine "Schnittstelle" und "Fabrik" -Klassen zu erstellen und sie zu exportieren ...

Können Sie einen anderen Weg vorschlagen, um das zu lösen?

Antwort

11

Verwenden Sie die "Pimpl" Idiom:

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

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

Irgendein Grund, boost :: scoped_ptr nicht zu benutzen? – grigy

+0

Nichts Besonderes - ich war es gewohnt, auto_ptr zu verwenden - es ist in diesem Fall wahrscheinlich angemessener, scoped_ptr zu verwenden, da es keine Eigentumsübertragung gibt –

13

The Private Implementation (PIMPL) Muster:

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

Grundsätzlich legen Sie fest, dass Ihre Klasse einen Zeiger auf eine Struktur enthält, die Sie nach vorne erklären. Dann definieren Sie die Struktur in der cpp-Datei und verwenden den Konstruktor und den Destruktor in Ihrer Klasse, um die PIMPL zu erstellen/löschen.

:)

0

Alle der inneren Struktur von QT ist Klassen Private Umsetzung getan werden.
Sie können es für eine gute Referenz nachsehen, wie es richtig gemacht wird.