J'aimerais pouvoir utiliser un objet ( unique ) n'importe o=F9 dans
certaines classes de mon projet.
Typiquement imaginons que cette objet soit un fichier de log ( classe
L ).
J'aimerais pouvoir faire =E0 tout moment un truc du style:
L::set( x ); // <----- =E9crit x dans un fichier commun =E0 toutes
mes classes
Naturellement, je pensais =E0 un objet instanci=E9 de fa=E7on globale avant
le main, mais est-ce tr=E8s propre ... ?
On appelle ça un singleton. En voici un exemple naïf :
class L { static L * instance ; L() { } ;
public: static L * get() { if(!instance) instance = new L ;
return instance ; }
static void clear() { delete instance ; } } ;
L * L::instance = 0 ;
Son usage :
L * log = L::get() ; /* on fait joujou sur log */ L::clear() ;
Je ne sais pas si la fonction membre clear() est vraiment utile, mais elle devrait au moins remettre a NULL le pointeur apres le delete, sinon il y aura un soucis apres le prochain get().
Mickaël Wolff a écrit :
Gégé a écrit :
Quelqu'un aurait-il une suggestion ? Merci.
On appelle ça un singleton. En voici un exemple naïf :
class L
{
static L * instance ;
L() { } ;
public:
static L * get()
{
if(!instance)
instance = new L ;
return instance ;
}
static void clear()
{
delete instance ;
}
} ;
L * L::instance = 0 ;
Son usage :
L * log = L::get() ;
/* on fait joujou sur log */
L::clear() ;
Je ne sais pas si la fonction membre clear() est vraiment utile,
mais elle devrait au moins remettre a NULL le pointeur apres
le delete, sinon il y aura un soucis apres le prochain get().
On appelle ça un singleton. En voici un exemple naïf :
class L { static L * instance ; L() { } ;
public: static L * get() { if(!instance) instance = new L ;
return instance ; }
static void clear() { delete instance ; } } ;
L * L::instance = 0 ;
Son usage :
L * log = L::get() ; /* on fait joujou sur log */ L::clear() ;
Je ne sais pas si la fonction membre clear() est vraiment utile, mais elle devrait au moins remettre a NULL le pointeur apres le delete, sinon il y aura un soucis apres le prochain get().
Gégé
ca me parfait nickel pour ce que je veux faire merci bcp pour cette suggestion.
ca me parfait nickel pour ce que je veux faire
merci bcp pour cette suggestion.
Je ne sais pas si la fonction membre clear() est vraiment utile,
J'aurais eu la remarque sur la fuite mémoire si je n'en avais pas proposé ;)
Non, parce qu'il n'y a qu'une seule allocation et que l'objet alloué va perdurer jusqu'a la fin du programme. Si le systeme recupere automatiquement toute la memoire utilisee par le programme a la fin de celui-ci, ca ne va deranger personne, sauf un outil d'analyse de gestion de mémoire.
mais elle devrait au moins remettre a NULL le pointeur apres le delete, sinon il y aura un soucis apres le prochain get().
Tout à fait, je pensais l'avoir écrit. mais bon, implémentation naïve j'avais dit :p
Oui.
Mickaël Wolff a écrit :
Michel Decima a écrit :
Je ne sais pas si la fonction membre clear() est vraiment utile,
J'aurais eu la remarque sur la fuite mémoire si je n'en avais pas
proposé ;)
Non, parce qu'il n'y a qu'une seule allocation et que l'objet alloué
va perdurer jusqu'a la fin du programme. Si le systeme recupere
automatiquement toute la memoire utilisee par le programme a la fin
de celui-ci, ca ne va deranger personne, sauf un outil d'analyse
de gestion de mémoire.
mais elle devrait au moins remettre a NULL le pointeur apres
le delete, sinon il y aura un soucis apres le prochain get().
Tout à fait, je pensais l'avoir écrit. mais bon, implémentation naïve
j'avais dit :p
Je ne sais pas si la fonction membre clear() est vraiment utile,
J'aurais eu la remarque sur la fuite mémoire si je n'en avais pas proposé ;)
Non, parce qu'il n'y a qu'une seule allocation et que l'objet alloué va perdurer jusqu'a la fin du programme. Si le systeme recupere automatiquement toute la memoire utilisee par le programme a la fin de celui-ci, ca ne va deranger personne, sauf un outil d'analyse de gestion de mémoire.
mais elle devrait au moins remettre a NULL le pointeur apres le delete, sinon il y aura un soucis apres le prochain get().
Tout à fait, je pensais l'avoir écrit. mais bon, implémentation naïve j'avais dit :p