2008-10-15 6 views
5

L'une des classes de mon programme utilise une bibliothèque tierce. objet bibliothèque est un membre privé de ma classe:En-têtes C++ - séparation entre l'interface et les détails d'implémentation

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

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

Le problème avec cette - toute autre unité dans mon programme qui utilise Ma classe doit être configuré pour inclure 3p têtes. Passer à un autre type de 3p mettra en danger toute la construction ... Je vois deux façons de résoudre ce problème - l'une consiste à faire 3pObject extern et à transformer m_Object en un pointeur, en cours d'initialisation dans le constructeur; la deuxième est de créer une "interface" et "usine" classes et les exporter ...

Pourriez-vous suggérer une autre façon de résoudre ce problème?

Répondre

11

Utilisez le langage "de Pimpl":

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

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

Une raison de ne pas utiliser boost :: scoped_ptr? – grigy

+0

Rien de spécifique - J'ai été habitué à utiliser auto_ptr - il est probablement plus approprié dans ce cas d'utiliser scoped_ptr car il n'y a pas de transfert de propriété –

13

Le modèle mise en œuvre privée (PIMPL):

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

Fondamentalement, vous définissez que votre classe contient un pointeur sur une struct que vous déclarez avant. Ensuite, vous définissez la structure dans le fichier cpp et utilisez le constructeur et le destructeur dans votre classe pour créer/supprimer le PIMPL.

:)

0

Toute la structure interne de QT est réalisée à l'aide des cours de mise en œuvre privée.
Vous pouvez rechercher une bonne référence sur la façon dont cela est fait correctement.

Questions connexes