2010-02-23 16 views
4

Quelle est la bonne façon d'implémenter cette classe?idiome Pimpl utilisé avec une variable membre de la classe

//Header 
#include <boost/shared_ptr.hh> 

class MyClass 
{ 
public: 

    static foo() 
    static foobar(); 

private: 
    class pimpl; 
    static boost::shared_ptr<pimpl> m_handle; 
    static bool initialized; 
}; 


//source 
namespace 
{ 
    bool init() 
    { 
    //... 
    // init() can't access m_handle, unless it is a friend of MyClass 
    // but that seems a bit "tacky", is there a better way? 
    } 
} 


class MyClass::pimpl 
{ 
    public: 
     ~pimpl(){} 
}  


bool MyClass::initialized = init(); 

MyClass::foo() 
{ 
    //... 
} 

MyClass::foobar() 
{ 
    //... 
} 
+0

Comme un autre problème: je pense que vous ne pouvez pas vous lier d'amitié avec la fonction si elle se trouve dans un espace de noms sans nom. –

Répondre

4

MyClass est un singleton - certains l'appellent un global glorifié. Un motif souvent abusé. Utiliser des cteurs privés et un accesseur statique public:

MyClass { 
     public: 
      static MyClass& Instance() { 
       static MyClass obj; 
       return obj; 
      } 
     // ... 
     private: 
      MyClass() : m_handle(pimpl()), initialized(true) {} 
     // ... 
}; 
+1

Voir http://en.wikipedia.org/wiki/Singleton_pattern pour plus d'informations sur le motif Singleton. Comme la méthode ci-dessus n'est pas threadsafe – Eld

+0

@Eld: Et je me demandais pourquoi vous parlez de la sécurité des threads jusqu'à ce que je suis tombé sur l'autre question de l'OP ... – dirkgently