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

 


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

Héritage de classe et vector

n°590332
nraynaud
lol
Posté le 14-12-2003 à 10:22:09  profilanswer
 

Reprise du message précédent :

Code :
  1. #include<iostream>
  2. using namespace std;
  3. class Animal;
  4. class Chien;
  5. class Chat;
  6. class VisiteurAnimalier;
  7. class Animal {
  8. public :
  9.         virtual string bruit() = 0;
  10. virtual void accepte(VisiteurAnimalier &vis) = 0;
  11.        
  12. };
  13. class FabriqueDAnimaux {
  14. public :
  15.     virtual Animal *creeAnimal() = 0;
  16. };
  17. class VisiteurAnimalier {
  18. public :
  19.     virtual void visiteChien(Chien *lechien) = 0;
  20.     virtual void visiteChat(Chat *lechat) = 0;
  21.     virtual ~VisiteurAnimalier() = 0;
  22. };
  23. class Chien : Animal {
  24.     class FabriqueDeChien : FabriqueDAnimaux {
  25.     public :
  26.         virtual Animal *creeAnimal() {
  27.             return new Chien();
  28.         };
  29.     };
  30.    
  31. public :
  32.     static const FabriqueDeChien *fabrique;
  33.    
  34.     virtual string bruit() {
  35.         return "OUAF";
  36.     }
  37.     void accepte(VisiteurAnimalier &vis) {
  38.         vis.visiteChien(this);
  39.     }
  40.     // ça connerie à lui
  41.     void mordre() {
  42.         cout << "je luis mords le mollet" << endl;
  43.     }
  44. };
  45. class Chat : Animal {
  46.     class FabriqueDeChat : FabriqueDAnimaux {
  47.     public :
  48.         virtual Animal *creeAnimal() {
  49.             return new Chat();
  50.         };
  51.     };
  52. public :   
  53.     static const FabriqueDeChat *fabrique;
  54.    
  55.     virtual string bruit() {
  56.         return "Miaou";
  57.     }
  58.     virtual void accepte(VisiteurAnimalier &vis) {
  59.         vis.visiteChat(this);
  60.     }
  61.    
  62.     // la connerie que lui seul peut faire
  63.     void grimperArbre() {
  64.         cout << "je grimpe et je suis trop con pour redescendre" << endl;
  65.     }
  66. };
  67. class VisiteurDeconneur : VisiteurAnimalier {
  68. public :
  69.     ~VisiteurDeconneur();
  70.     virtual void visiteChien(Chien *lechien) {
  71.         lechien->mordre();
  72.     };
  73.     virtual void visiteChat(Chat *lechat) {
  74.         lechat->grimperArbre();
  75.     };
  76. };
  77. const Chat::FabriqueDeChat *Chat::fabrique = new FabriqueDeChat();
  78. const Chien::FabriqueDeChien *Chien::fabrique = new FabriqueDeChien();


(j'imagine que Taz corrigera ce qui lui plait pas)
 
voilà l'esprit de tous les services que tu veux, en version bien typée et propre.
Il y a un Pattern Fabrique Abstraite (classe dont les instances sont des usines à instances) l'intérêt est de pouvoir fabriquer des animaux "à l'aveuglette", imagine par exemple un monde un peu crado où pour avoir un animal de compagnie on doive acheter un jeton pui passer le jeton à l'Administration qui va lui fabriquer le chien et l'enregistrer légalement par la même occasion. Le jeton contiendra une référence à la Fabrique idoine, mais le fonctionnaire ne saura pas quel annimal sera créé (il s'en fout).  
C'est pas top comme exemple, mais je vois pas à quoi pourrait te servir ta fabrique dans ton modèle.
 
Pour les traitements spécifique par animal, il y a tout le système de Visiteur, un objet qui a un traitement spécifique par animal est un VisiteurAnimalier (qui ne modélise pas une personne mais un trait de personnalité d'un objet).
 
Au passage, j'ai mis les fabriques en Singleton, c'est-à-dire qu'il n'existe qu'une seule instance de la classe FabriqueDeChat accessible dans la classe.


---------------
trainoo.com, c'est fini
mood
Publicité
Posté le 14-12-2003 à 10:22:09  profilanswer
 

n°590340
gilou
Modérateur
Modzilla
Posté le 14-12-2003 à 11:25:21  profilanswer
 

Taz a écrit :

réfléchissez une peu sur ce que ça veut dire "castrer" et pensez au types.

[:chacal_one333]
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°590342
gilou
Modérateur
Modzilla
Posté le 14-12-2003 à 11:27:41  profilanswer
 

Tiens, puisque l'on cause de typage, j'ai recupere hier mon exemplaire de Types and Programming Languages de Pierce, edite par le MIT.  
A+,


Message édité par gilou le 14-12-2003 à 11:27:52

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°590343
nraynaud
lol
Posté le 14-12-2003 à 11:34:13  profilanswer
 

gilou a écrit :

Tiens, puisque l'on cause de typage, j'ai recupere hier mon exemplaire de Types and Programming Languages de Pierce, edite par le MIT.  
A+,

tu me le prêtes ?


---------------
trainoo.com, c'est fini
n°590344
gilou
Modérateur
Modzilla
Posté le 14-12-2003 à 11:38:41  profilanswer
 

nraynaud a écrit :

tu me le prêtes ?


Il faut d'abord que je le lise.
Je l'ai recupere chez le libraire.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°590433
Taz
bisounours-codeur
Posté le 14-12-2003 à 15:16:25  profilanswer
 

ça me plait pas du tout comme conception. Pour moi, c'est un bonne exemple de comment transformer quelque chose de simple en un cauchemard de POO. Tes fabriques sont complètement inutiles....
ton pattern de visiteur, il ne fait que rajouter un niveau de plus inutile. Bref, je suis pas d'accord du tout du tout
 
puis évidemment le C++ est mauvais.

n°590530
iraysyvalo
Posté le 14-12-2003 à 17:30:23  profilanswer
 


Ou la .. t'es dur Taz .. c'est quoi un mauvais C++ ?  
 
En tout cas, ca me fait penser a du Java ...

n°590727
nraynaud
lol
Posté le 14-12-2003 à 22:20:40  profilanswer
 

Taz a écrit :

Bref, je suis pas d'accord du tout du tout
 
puis évidemment le C++ est mauvais.

ça m'étonne tiens !


---------------
trainoo.com, c'est fini
n°590782
Profil sup​primé
Posté le 15-12-2003 à 00:10:40  answer
 

Et bien je vois que mon topic suscite bien des choses...
 
Sinon une petite question ?  
 
Quelle est le nombre d'éléments max dans un vector parce que j'ai ce code:
 

Code :
  1. int i=0;
  2. int NbSerials=50000;
  3. for(i=0;i<NbSerials;i++)
  4.         {
  5.         ListeTest.push_back(GenerateRandomSerial());
  6.         }


 
Et la boucle fige le programme quand le nombre d'itérations dépasse en gros les 53000.
 
Ca me pose un problème parce qu'il faut que je remplisse ce tableau d'entiers avec beaucoup plus de valeurs pour vérifier ensuite dessus que les nombres générés sont bien pseudo-aléatoires et qu'aucun d'entre eux ne sont identiques mais sur 50000 c'est un peu léger...

n°590789
Taz
bisounours-codeur
Posté le 15-12-2003 à 00:20:50  profilanswer
 

y a pas de limite, si ce n'est ta RAM.
si tu connais la taille, fais un ListeTest.reserve(NbSerials), pour éviter les réallocations

mood
Publicité
Posté le 15-12-2003 à 00:20:50  profilanswer
 

n°590796
Profil sup​primé
Posté le 15-12-2003 à 00:35:33  answer
 

Taz a écrit :

y a pas de limite, si ce n'est ta RAM.
si tu connais la taille, fais un ListeTest.reserve(NbSerials), pour éviter les réallocations


 
Merci effectivement c'est ma fonction random qui perd les pédales quelque part... j'ai plus qu'à débuguer ca  :cry:

n°590797
Taz
bisounours-codeur
Posté le 15-12-2003 à 00:36:57  profilanswer
 

c'est quoi ta fonction ? pourquoi tu ne réutilise pas quelque chose  comme chez boost ?

n°590799
Profil sup​primé
Posté le 15-12-2003 à 00:45:06  answer
 

Taz a écrit :

c'est quoi ta fonction ? pourquoi tu ne réutilise pas quelque chose  comme chez boost ?


 
boost je connais pas, par contre la c'est rien de bien compliqué, ca doit juste retourner un identifiant aléatoire à 8 chiffres par contre c'est étrange , voilà le code :
 

Code :
  1. int GenerateRandomSerial(void)
  2. {
  3. int Random=0;
  4. Random=(GetTickCount()*rand())%100000000;
  5. //si Random n'est pas à 8 chiffres
  6. //on le multiplie par 8 (peu importe en fait)
  7. //jusqu'à atteindre une valeur acceptable
  8. if(Random<10000000)
  9.         {
  10.          do
  11.            {
  12.            Random=Random*8;
  13.            }
  14.          while(Random<10000000);
  15.         }
  16. return Random;
  17. }


 
En fait ca plante sur cette partie du code :
 

Code :
  1. if(Random<10000000)
  2.         {
  3.          do
  4.            {
  5.            Random=Random*8;
  6.            }
  7.          while(Random<10000000);
  8.         }


 
et bizarrement c'est toujours à la 53138 ème itération il me semble  :??:
 
EDIT: De toute facon il faut que je change cette fonction, je pensais que ca allait bien fonctionner , c'est loin d'etre le cas, j'ai entre 10 et 15% de doublons quels que soit le nb d'itérations, c bcp trop


Message édité par Profil supprimé le 15-12-2003 à 00:54:19
n°590803
blackgodde​ss
vive le troll !
Posté le 15-12-2003 à 00:54:36  profilanswer
 

   if(Random<10000000)
            {
               do
                 {
                   Random=Random*8;
                 }
               while(Random<10000000);
            }
=>
    while(Random<10000000)
            {
                 Random=Random*8;
            }


---------------
-( BlackGoddess )-
n°590804
blackgodde​ss
vive le troll !
Posté le 15-12-2003 à 00:55:28  profilanswer
 

pourquoi tu génères pas un identifiant chiffre par chiffre ?


---------------
-( BlackGoddess )-
n°590806
Profil sup​primé
Posté le 15-12-2003 à 00:57:14  answer
 

BlackGoddess a écrit :

   if(Random<10000000)
            {
               do
                 {
                   Random=Random*8;
                 }
               while(Random<10000000);
            }
=>
    while(Random<10000000)
            {
                 Random=Random*8;
            }
 


 
Mmm certes  :sweat: c'est plus simple, je suis pas bien reveillé moi  ;)

n°590807
Profil sup​primé
Posté le 15-12-2003 à 00:58:04  answer
 

BlackGoddess a écrit :

pourquoi tu génères pas un identifiant chiffre par chiffre ?


 
Oui je vais peut etre essayer ca, parce que la c'est pas bon du tout, sur 20000 j'en ai 25% d'identiques  :cry:

n°590808
blackgodde​ss
vive le troll !
Posté le 15-12-2003 à 00:59:23  profilanswer
 

tu mets srand((unsigned)time()) avant d'appeler rand ?


---------------
-( BlackGoddess )-
n°590809
Profil sup​primé
Posté le 15-12-2003 à 01:04:44  answer
 

BlackGoddess a écrit :

tu mets srand((unsigned)time()) avant d'appeler rand ?


 
Non mais je viens d'essayer c'est encore pire, j'ai l'impression que c'est rand() qui me renvoie des trucs pas top, et en plus GetTickCount() doit en fait servir à rien car il doit renvoyer le meme résultat... enfin merci je vais rebosser ce truc là...
 
Par contre le
 

Code :
  1. while(Random<10000000)
  2.             {
  3.                  Random=Random*8;
  4.             }


 
ok c'est mieux par contre je comprends pas pourquoi mais ca me plante toujours après 53000 et quelques itérations  :heink:


Message édité par Profil supprimé le 15-12-2003 à 01:05:46
n°590814
Taz
bisounours-codeur
Posté le 15-12-2003 à 01:33:35  profilanswer
 

vas voir chez boost :o
 
sinon tu fais juste
 
A + randomEntre(A, B)

n°590869
Kristoph
Posté le 15-12-2003 à 08:51:51  profilanswer
 

Et si Random == 0 ? :D

n°592187
marmotte.t​ranquille
Posté le 16-12-2003 à 22:12:04  profilanswer
 

Tu as défini :
 

Code :
  1. int Random


 
Je suppose que sur ta machine, les int sont codés en 16 bits donc ton Random prend une valeur entre -32768 et +32767.
Ce qu'il t'arrive ce sont des overflow.

n°592222
Taz
bisounours-codeur
Posté le 16-12-2003 à 23:05:56  profilanswer
 

marmotte.tranquille a écrit :

Tu as défini :
 

Code :
  1. int Random


 
Je suppose que sur ta machine, les int sont codés en 16 bits donc ton Random prend une valeur entre -32768 et +32767.
Ce qu'il t'arrive ce sont des overflow.
 

:heink: déjà RAND_MAX sur un système 32bits, c'est souvent 2**15-1  

n°592250
blackgodde​ss
vive le troll !
Posté le 17-12-2003 à 00:22:19  profilanswer
 

2**15-1 = 32767 ?!


---------------
-( BlackGoddess )-
n°592255
marmotte.t​ranquille
Posté le 17-12-2003 à 00:28:21  profilanswer
 

Taz a écrit :

:heink: déjà RAND_MAX sur un système 32bits, c'est souvent 2**15-1  


 
Ce que je veux dire, c'est qu'il aura du mal à atteindre 8 chiffres...
 
Edit : et je ne comprends pas la pertinence de ta réponse


Message édité par marmotte.tranquille le 17-12-2003 à 00:33:39
n°592256
Profil sup​primé
Posté le 17-12-2003 à 00:48:45  answer
 

marmotte.tranquille a écrit :


 
Ce que je veux dire, c'est qu'il aura du mal à atteindre 8 chiffres...
 
Edit : et je ne comprends pas la pertinence de ta réponse


 
non non c'est bon pas de problèmes avec les entiers, qui sont sur 32bits et non pas 16 d'ailleurs... enfin j'ai completement changé ma méthode entre temps, ca marche a peu pres...
 
J'arrive à 2 doublons en moyenne sur 1 million de conbinaisons c'est assez fiable pour ce que j'ai besoin de faire.

n°592257
Taz
bisounours-codeur
Posté le 17-12-2003 à 00:58:18  profilanswer
 

putain passe à boost ! et tu verras pas un doublon de ta putain de vie :o

n°592258
LeGreg
Posté le 17-12-2003 à 01:08:54  profilanswer
 

un generateur qui ne sort pas un doublon c'est le signe d'un mauvais generateur.
(en fait c'est le coup de magicien du prof de math qui fait tirer des nombres aléatoirement (dé) et d'autres manuellement par des eleves, l'éleve discipliné il essaiera de faire en sorte que sa suite ait l'air "aléatoire" et il évitera les doublons comme la peste alors que le générateur aléatoire (dé) il n'en a rien a faire)
 
LeGreg

n°592259
Profil sup​primé
Posté le 17-12-2003 à 01:14:04  answer
 

legreg a écrit :

un generateur qui ne sort pas un doublon c'est le signe d'un mauvais generateur.
(en fait c'est le coup de magicien du prof de math qui fait tirer des nombres aléatoirement (dé) et d'autres manuellement par des eleves, l'éleve discipliné il essaiera de faire en sorte que sa suite ait l'air "aléatoire" et il évitera les doublons comme la peste alors que le générateur aléatoire (dé) il n'en a rien a faire)
 
LeGreg


 
Certes mais en quoi est ce mauvais ?
 
Parce que pour générer des identifiants uniques, j'aime mieux ne pas avoir de doublons  ;)  :??:

n°592260
LeGreg
Posté le 17-12-2003 à 01:14:55  profilanswer
 

billyboy78 a écrit :


Code :
  1. if(Random<10000000)
  2.         {
  3.          do
  4.            {
  5.            Random=Random*8;
  6.            }
  7.          while(Random<10000000);
  8.         }




 
Et comment tu fais quand random est égal à zero ?
 
LeGreg

n°592261
Profil sup​primé
Posté le 17-12-2003 à 01:15:07  answer
 

Taz a écrit :

putain passe à boost ! et tu verras pas un doublon de ta putain de vie :o


 
J'y ai jeté un coup d'oeil, ca semble sympa en effet mais j'ai pas encore eu le temps de mettre en application  :hello:

n°592263
Profil sup​primé
Posté le 17-12-2003 à 01:15:49  answer
 

legreg a écrit :


 
Et comment tu fais quand random est égal à zero ?
 
LeGreg


 
 :kaola:  je sais il y avait un gros bug mais ca date ce code, j'ai tout modifié depuis...
 
Je pense que c'etais d'ailleurs ca qui me bloquait le traitement de temps en temps  ;)


Message édité par Profil supprimé le 17-12-2003 à 01:16:35
n°592264
LeGreg
Posté le 17-12-2003 à 01:16:03  profilanswer
 

billyboy78 a écrit :


Parce que pour générer des identifiants uniques, j'aime mieux ne pas avoir de doublons  ;)  :??:  


 
Ben pour generer des identifiants uniques, deja tu commences
par ne pas les tirer aux dés.
 
LeGreg

n°592267
Profil sup​primé
Posté le 17-12-2003 à 01:20:36  answer
 

legreg a écrit :


 
Ben pour generer des identifiants uniques, deja tu commences
par ne pas les tirer aux dés.
 
LeGreg


 
Pourquoi pas, mais alors comment faire ? en utilisant le résultat de certaines fonctions mathématiques particulières ? (je suis pas très callé sur le sujet... je prefère prévenir)
 
En même temps le sujet originel du post n'est pas la génération de nombres pseudo-aléatoires sans doublons en c++  :ange: , il vaudrait peut-etre mieux parler de ca dans un topic spécifique.


Message édité par Profil supprimé le 17-12-2003 à 01:24:59
n°592271
Taz
bisounours-codeur
Posté le 17-12-2003 à 01:28:47  profilanswer
 

billyboy78 a écrit :


 
Pourquoi pas, mais alors comment faire ? en utilisant le résultat de certaines fonctions mathématiques particulières ? (je suis pas très callé sur le sujet... je prefère prévenir)
 
En même temps le sujet originel du post n'est pas la génération de nombres pseudo-aléatoires sans doublons en c++  :ange: , il vaudrait peut-etre mieux parler de ca dans un topic spécifique.

y a rien a dire : tu prends une des quinze miss de chez boost et t'en tout ton saoul :o

n°592272
Profil sup​primé
Posté le 17-12-2003 à 01:34:20  answer
 

Taz a écrit :

y a rien a dire : tu prends une des quinze miss de chez boost et t'en tout ton saoul :o


 
Houlà tu as du mal à prononcer, faut pas manger des pépitos en même temps  :whistle:

n°592274
LeGreg
Posté le 17-12-2003 à 01:36:16  profilanswer
 

Si tu veux qu'ils soient tous différents tu les numérotes de 1 à 50000

n°592276
Profil sup​primé
Posté le 17-12-2003 à 01:46:32  answer
 

legreg a écrit :

Si tu veux qu'ils soient tous différents tu les numérotes de 1 à 50000


 
Mmm remarque c'est vrai que c'est pas plus bete qu'autre chose... :sweat:

n°592278
Taz
bisounours-codeur
Posté le 17-12-2003 à 02:35:40  profilanswer
 

billyboy78 a écrit :


 
Houlà tu as du mal à prononcer, faut pas manger des pépitos en même temps  :whistle:  

je veux bien que tu comprennes qu'il y a de tout dans le bordel de boost :o

n°592313
blackgodde​ss
vive le troll !
Posté le 17-12-2003 à 09:38:22  profilanswer
 

les GUID de windows utilisent le temps en cours + un nombre généré a partir de la configuration de la machine + un nombre aléatoire.


---------------
-( BlackGoddess )-
n°592333
nraynaud
lol
Posté le 17-12-2003 à 10:12:00  profilanswer
 

billyboy78 a écrit :


 
Pourquoi pas, mais alors comment faire ? en utilisant le résultat de certaines fonctions mathématiques particulières ? (je suis pas très callé sur le sujet... je prefère prévenir)
 
En même temps le sujet originel du post n'est pas la génération de nombres pseudo-aléatoires sans doublons en c++  :ange: , il vaudrait peut-etre mieux parler de ca dans un topic spécifique.

y'a une norme internationale (ou une RFC, je sais plus) pour faire ça. un nombre de 32bits qui soit unique au monde.
C'est utilisé pour identifier les services COM, CORBA et autres conneries qui ont bsoin d'identifiants uniques.


---------------
trainoo.com, c'est fini
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

Aller à :
Ajouter une réponse
 

Sujets relatifs
Probleme d'heritage et de surcharge en C#passage de std::string (ou std::vector<char>) à bit_vector (ou bitset)
Source de la classe LoginContexttype contenu ds un vector
VB + Classe - Tableau d'objet[Java] interface: heritage de methodes statiques
Comment se servir dans une classe d'une fonction menbre d'une autre?[Java]Appeler une méthode d'une classe à partir d'1 String [Résolu]
Comment inclure une classe dans une autre?Gestion d'une variable de classe
Plus de sujets relatifs à : Héritage de classe et vector


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