Hello,
Salut,
Pourquoi pas, tout simplement, quelque chose de fort proche de
Code :
class Singleton
{
public:
static Singleton & instance() // crée l'instance en cas de besoin
{
if(!inst_)
inst_ = new Singleton();
return *inst_;
}
static void destroy() // détruit l'instance à l'envie
{
delete inst_;
inst_ = NULL;
}
/*...*/
private:
Singleton(){}
~Singleton(){}
static Singleton * inst_;
};
// ne pas oublier de définir inst_ à NULL dans un fichier d'implémentation
En fait, j'ai une contrainte supplémentaire dont je n'avais pas parlé: cet objet de type singleton est instancié via une factory (génération automatique d'objets depuis un fichier XML). Cette factory stock en interne une map de string->fonction renvoyant un IIoObject*(type de base des objets instanciables depuis un fichier XML). Mon singleton doit donc se comporter comme n'importe quel autre IIoObject, ce qui exclut les méthodes statiques de type Instance() qui créées l'objet au premier appel. C'est pour ca que j'étais parti sur la solution foireuse de mon premier post. Cela dit, je peut peut être modifier la fonction enregistrer dans ma factory (la même pour tous) uniquement pour mon singleton. Cela donnerait:
1 2 3 4 5
| template <typename T, typename U>
boost::shared_ptr<T> CreateSingleton()
{
return boost::shared_ptr<T>(U::Instance());
} |
au lieu de la fonction utilisée par tous:
1 2 3 4 5
| template <typename T, typename U>
boost::shared_ptr<T> Create()
{
return boost::shared_ptr<T>(new U());
} |
Pour les register dans la factory cela donnerait:
RegisterClass("MonSingleton", &CreateSingleton<IIoObject,MonSingleton>)
au lieu de
RegisterClass("MonSingleton", &Create<IIoObject,MonSingleton>)
Ça me semble plus propre que le pseudo singleton dynamique initiale non?
Partager