Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3047 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Des conseils sur mon programme, SVP

n°750167
Joel F
Real men use unique_ptr
Posté le 03-06-2004 à 09:51:57  profilanswer
 

Reprise du message précédent :
un singleton est un objet à instance unique.
Son principe repose sur le controle du nbre d'instance de la classe
en rendant private les constructeurs de la classe.
Un exemple simple :
 

Code :
  1. class Singleton
  2. {
  3.   public :
  4.    static Singleton*  GetInstance()
  5.    {
  6.        if( !Instance ) Instance = new Singleton;
  7.        return Instance;
  8.    }
  9.    static Singleton*  ReleaseInstance()
  10.    {
  11.        if( Instance ) delete Instance;
  12.    }
  13.    // D'autres méthodes non statiques
  14.    void f();
  15.    void g();
  16.    private :
  17.   Singleton() {}
  18.   Singleton( const Singleton& ) {}
  19.   ~Singleton() {}
  20.   static Singleton* Instance
  21. };
  22. Singleton* Singleton::Instance = NULL;


 
 
L'accés se fait ensuite via :
 

Code :
  1. #include "singleton.h"
  2. void toto()
  3. {
  4.      Singleton* sg = Singleton::getInstance();
  5.      sg->g();
  6. }
  7. int main( int,char**)
  8. {
  9.      Singleton* sg = Singleton::getInstance();
  10.      sg->f();
  11.     toto();
  12.  
  13.     return 0;
  14. )


Message édité par Joel F le 03-06-2004 à 10:29:45
mood
Publicité
Posté le 03-06-2004 à 09:51:57  profilanswer
 

n°750172
Joel F
Real men use unique_ptr
Posté le 03-06-2004 à 09:53:46  profilanswer
 

Note que en général il faut limiter l'usage des Singleton.
Un Singleton ca va, beaucoup, bonjour les dégats.

n°750221
cricri_
Posté le 03-06-2004 à 10:20:46  profilanswer
 

ça serait pas plutôt :

Code :
  1. static Singleton*  GetInstance()
  2.        {
  3.              if( Instance == NULL) Instance = new Singleton;
  4.                return Instance;
  5.        }


Bon je n'ai probablement pas tout compris ... car pour moi il faudrait aussi compter le nombre de GetInstance, donc on va dire le nombre de client, afin de n'effectuer le delete que sur le dernier, non ?


Message édité par cricri_ le 03-06-2004 à 10:30:26
n°750235
Joel F
Real men use unique_ptr
Posté le 03-06-2004 à 10:29:34  profilanswer
 

cricri_ a écrit :

ça serait pas plutôt :

Code :
  1. static Singleton*  GetInstance()
  2.        {
  3.              if( Instance == NULL) Instance = new Singleton;
  4.                return Instance;
  5.        }




 
evidemment, fallait que je me plante ^^
merci je corrige

n°750245
cricri_
Posté le 03-06-2004 à 10:33:00  profilanswer
 

Et pour ma deuxième remarque ? ne faut-il pas utiliser un compteur static également pour compter les clients ? puis remettre Instance à NULL lorsqu'on fait réellement le delete pour autoriser une nouvelle instance ?

n°750250
Joel F
Real men use unique_ptr
Posté le 03-06-2004 à 10:34:51  profilanswer
 

cricri_ a écrit :

Et pour ma deuxième remarque ? ne faut-il pas utiliser un compteur static également pour compter les clients ? puis remettre Instance à NULL lorsqu'on fait réellement le delete pour autoriser une nouvelle instance ?


 
non pas besoin. si tu fait 2 GetInstance d'affilé, le deuxieme renvoit la même instance que le premier. Pour le destructeur à la limite, de toute maniére tu n'appelles ReleaseInstance qu'une suels fois.
 
Apres tu mélange singleton et RefCoutn pourquoi pas ^^a cemoment renvoit un auto-ptr ou un smart_ a la place d'un Singleton*

n°750272
cricri_
Posté le 03-06-2004 à 10:42:53  profilanswer
 

Vi, je parlais du ReleaseInstance(), car on peut penser que pour chaque GetInstance() il y ait ensuite un ReleaseInstance().

n°750281
Joel F
Real men use unique_ptr
Posté le 03-06-2004 à 10:45:36  profilanswer
 

cricri_ a écrit :

Vi, je parlais du ReleaseInstance(), car on peut penser que pour chaque GetInstance() il y ait ensuite un ReleaseInstance().


 
non, il n'y a qu'une releaseInstance qqsoit le nbr de GetInstance.

n°750485
yawen
Posté le 03-06-2004 à 12:18:34  profilanswer
 

je vois pas la différence entre
 

Code :
  1. static Singleton*  GetInstance()
  2.        {
  3.              if( !Instance ) Instance = new Singleton;
  4.                return Instance;
  5.        }


 
et
 

Code :
  1. static Singleton*  GetInstance()
  2.          {
  3.                  if( Instance == NULL) Instance = new Singleton;
  4.                      return Instance;
  5.          }


 
puisque pour moi, !Instance est équivalent à Instance==NULL
 
sinon, j'ai compris le principe du truc, mais ça sert à quoi ? enfin si vous avez lu tout le topic depuis le début (j'arriverais presque à comprendre si vous avez eu la flemme  :D ), dans mon cas, ça servirait à rien... puisque de toute façon, j'ai plusieurs instances pour mes tableaux, pour les objets, etc...

n°750518
yawen
Posté le 03-06-2004 à 12:28:31  profilanswer
 

et autre chose, aussi, j'ai jamais utilisé de variables static dans des classes, mais pourquoi la variable Instance est initialisée en dehors de la classe ? et en imiginant qu'on fasse plusieurs instances de la classe (donc pas pour un singleton), je suppose que les variables statiques ne sont initialisées qu'une fois ? et quand ? à la première instanciation de la classe, ou au lancement du programme ?

mood
Publicité
Posté le 03-06-2004 à 12:28:31  profilanswer
 

n°750584
yawen
Posté le 03-06-2004 à 13:05:13  profilanswer
 

hum, j'ai un petit problème avec les classes amies... comme je le disais avant, je voudrais que la classe HandleC puisse accéder aux données privées de la classe ContainerP. Le problème, c'est que toutes deux sont des classes template. J'ai fais un exemple plus simple :
 

Code :
  1. template <class T,class T1> class handle;
  2. template <class T> class container {
  3. int priv;
  4. public:
  5. friend class handle<T,float>; //comme ça, ça marche, sauf que je ne suis pas sensé savoir ici que le deuxième argument du template est 'float'
  6. int GetPriv() {return priv;};
  7. container() {};
  8. ~container() {};
  9. };
  10. template <class T,class T1> class handle {
  11. public:
  12. container<T> *owner;
  13. void test() {owner->priv=1;};
  14. handle() {};
  15. ~handle() {};
  16. };
  17. int main(int argc, char* argv[])
  18. {
  19. handle<int,float> h;
  20. container<int> c;
  21. h.owner=&c;
  22. h.test();
  23. printf("%d\n",c.GetPriv());
  24. return 0;
  25. }


 
le problème est que handle prend deux paramètre (T et T1) alors que container n'en as qu'un (T). le premier argument de la classe handle est forcément le même que celui de la classe container, mais le deuxième n'est pas connu par la classe container. le principe serais que la classe container stocke des objets de type T par des pointeurs, mais que des objets dérivés de la classe T peuvent aussi être stocké dans le container, et la classe handle doit connaitre la classe de base (T) et le type réel de l'objet (T1). là je vois pas trop comment m'y prendre...

n°750732
cricri_
Posté le 03-06-2004 à 14:23:36  profilanswer
 

Il n'y a aucune différence entre !instance et instance == NULL, Joël a corrigé entre temps.
Les variables statiques sont des variables de la classe et pas de l'instance si je me souviens à peu près, donc elles ne peuvent être initialisées lors de l'instanciation, on doit le faitre en dehors.

n°757755
Ummon
Posté le 09-06-2004 à 12:59:42  profilanswer
 

Arretez d'utiliser des macros datant du C, n'utilisez pas NULL !!!!

n°757757
yawen
Posté le 09-06-2004 à 13:12:45  profilanswer
 

ben on utilise quoi, alors ? (arrêtez de dire arrêtez sans dire quoi faire à la place, aussi...)

n°757758
Ummon
Posté le 09-06-2004 à 13:15:01  profilanswer
 

"[..] 0 se comporte comme une littérale pointeur, indiquant qu'un pointeur ne fait pas référence à un objet."
tiré du bouquin "Le langage C++, Bjarne Stroustrup"


Message édité par Ummon le 09-06-2004 à 13:24:06
n°757760
yawen
Posté le 09-06-2004 à 13:18:07  profilanswer
 

donc ça fais 5 caractères au lieu de 4 ? pourquoi ne pas utiliser NULL, dans ce cas ? c plus rapide à écrire pour le même résultat, non ?

n°757762
Ummon
Posté le 09-06-2004 à 13:23:07  profilanswer
 

Comment ca 4 caracètres ?, le [..] veut dire que j'ai coupé la phrase du bouquin ^_^´.
 
ca donne ca :

Code :
  1. int* i;
  2. //[..]
  3. //si i est initialisé
  4. if(i)
  5. {
  6.   //[..]
  7. }
  8. //[..]
  9. //si i n'est pas initialisé
  10. if(!i)
  11. {
  12.   //[..]
  13. }


 
On n'utilise pas 'NULL' tout simplement parce que ça n'existe pas en C++ .


Message édité par Ummon le 09-06-2004 à 13:26:23
n°757768
yawen
Posté le 09-06-2004 à 13:32:17  profilanswer
 

ok, lol, autant pour moi :p par contre, si tu veux faire "int *i=NULL", tu fais quoi ? "int* i=0" ?

n°757769
Ummon
Posté le 09-06-2004 à 13:33:39  profilanswer
 

oui :  
int* i = 0;
 
mais par défaut il pointe sur rien (0) donc un peu inutile.


Message édité par Ummon le 09-06-2004 à 13:34:06
n°757776
yawen
Posté le 09-06-2004 à 13:37:19  profilanswer
 

ben je savais pas si c t initialisé à 0 dès le début ou pas, mais par exemple si tu fais "int *i=new int[10];" et ensuite "delete i", il peut être utile de faire aussi "i=0", histoire de savoir si i pointe sur quelque chose ou pas... à propos, pour détruire un tableau créé avec new, il faut faire "delete i" ou "delete [] i" ?

n°757779
xterminhat​e
Si vis pacem, para bellum.
Posté le 09-06-2004 à 13:40:30  profilanswer
 

delete[]


---------------
Cordialement, Xterm-in'Hate...
n°757786
yawen
Posté le 09-06-2004 à 13:47:16  profilanswer
 

ok, merci. et je suppose que delete i ne détruit que le premier élément ? (i[0], donc)

n°757794
Ummon
Posté le 09-06-2004 à 13:51:42  profilanswer
 

effectivement tu dois faire un i=0 pour indiquer qu'il ne référence plus de valeur


Message édité par Ummon le 09-06-2004 à 13:52:07
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
crontab : programme javaAfficher un programme C++ Win32 sur le bureau, comment faire ?
Comment optimiser proprement et inteligement un programme NPetite vérif sur mon script de session, svp ?
Programme pour faire du C++ (code + design)Besoin d informations sur les DLL SVP
execution de programmeprogramme qui donne les nombres parfaits
Peut on lancer une commande shell unix apartir d'un programme Adaprogramme C# erreur :Unable to connect to any hosts....
Plus de sujets relatifs à : Des conseils sur mon programme, SVP


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR