comment dupliquer une liste de pointers ? (les objets pointés aussi). - C++ - Programmation
Marsh Posté le 10-01-2003 à 22:20:37
muni tes objets d'une méthode clone()
Code :
|
Marsh Posté le 10-01-2003 à 22:22:20
Code :
|
C'est ca que tu veux ?
LeGreg
edit: grille comme d'hab
Marsh Posté le 10-01-2003 à 22:37:20
mmm effectivement c ça qu'il me faut. J'avais vu que y avait ça en java mais j'ai pas percuté merci .
Sinon je mettrais bien le code histoire de ce marrer
Marsh Posté le 10-01-2003 à 22:43:13
sinon seul prob, j'aurais voulu pouvoir l'utiliser sur des types standart.
l.add(new int (i) );
comment rajouter la methode clone sur ce type ?
Je vois en specialisant le patron, mais y pas d'ot moyens ?
Marsh Posté le 10-01-2003 à 22:57:42
non. tiens une interrogation. est ce que c'est possible de spécialiser un template pour les types de bases, spécialisation de tempalte qui ferait appel à une unique classe template servant de wrapper+clone aux types de bases
Marsh Posté le 10-01-2003 à 23:14:34
Code :
|
ça me parait devoir marcher...
le type template doit etre muni d'une méthode T* clone() const. et pour obtenir ce const, on doit instancier un objet const: on fait donc appel a son constructeur par défaut. Donc T doit aussi posséder un constructeur par défaut.
edit: il y a sans doute pas mal de modification à apporter, mais c'est une piste interessante. mais en y réflechissant, disposer d'un conteneur pour manipuler des objets polymorphes qui s'adaptent aussi aux types de bases n'a pas vraiment de sens. Il faut chercher dans la spécialisation de template, certes, mais je pense qu'il faut surtout designer un conteneur dédié à ce genre de travail. Mais l'exercice de style est interessant et a retenir. Ici la synthaxe est sans doute mauvaise, les noms des paramètres templates mal choisis, des pointeurs là alors qu'il n'en faudrait pas, bref c'est la jungle. Me jetez pas la pierre, j'ai essayez de répondre à la question: on peut pas faire du tout en un. Le problème m'interesse mais j'ai pas le temps de le traiter, je vais pas non plus faire tout le boulot. et il me reste 23épisodes de 24H chrono a regardé
Marsh Posté le 10-01-2003 à 23:50:08
Je peux pas te répondre du tout.
Je met le code pour avoir des critiques constructives vu que y en a qui sont callés.
Code :
|
Code :
|
Marsh Posté le 11-01-2003 à 00:04:34
ca fait un peu beaucoup à lire:
petites remarques:
- essaye de plus utiliser les références constantes dans tes paramètres (comme pour setinfo)
- si unefonction membre de modifie pas l'objet, mets l'attribut const (getinfo, empty)
- void operator=(const Plist&). si tu fais ça tu empeches l1=l2=l3. peut etre est-ce volontaire. sinon tu fais
Code :
|
- utilise des types unsigned pour tes longueurs (je suis un chieur)
- ta methode affiche, bof, les ostream n'ont rien a faire avec ta classe (c'est une surspécification, dans la vraie vie, personne n'utilisera Plist.affiche(cout), on ne demande pas au structure de données de faire des GUI). la méthode consacrée, c'est string print() const, qui renvoie une chaine, représentation de l'objet
- vas y avec les inline
- construits tes membres
Code :
|
- !(a==b)) <=> (a!=b) !!!!!!!!!!!!!!!!!
- je crois pas avoir vu de using namespace std;
- initialise(sens large) tes varaibles au plus pres de leur déclaration
Code :
|
- et le type de retour de main doit etre int (pas la peine de spécifier un return 0
- dans tes déclarations de classe: saute des lignes et evite de mixer déclaration de variables et déclaration de fonctions membres
- etc
Marsh Posté le 11-01-2003 à 00:17:15
-references constante:
hem vu que ce que je passe en param est un pointeur c pas tres utile de metre un const. Ok pour le passage par ref, mais vu que c'est un pointeur c même pas sur que le compilateur accepte.
-si unefonction membre de modifie pas l'objet, mets l'attribut const (getinfo, empty)
En fin de fonction c ça ?
-void operator=(const Plist&). si tu fais ça tu empeches l1=l2=l3. peut etre est-ce volontaire.
vaguement volontaire, je voyais pas l'interet, mais pkoi pas, je vais le rajouter.
- utilise des types unsigned pour tes longueurs (je suis un chieur)
- vas y avec les inline
J'ai commencé tout en inline et j'ai mis dans un point h apres pour me forcer a la faire.
- construits tes membres
que veux tu dire par là ?
- (!(a==b)) <=> (a!=b)
exact je trouvais ça tout moche aussi .
- je crois pas avoir vu de using namespace std;
C'est quoi ?
-// il vaut mieux
Code :
|
tu veux dire:
Pnode<T>* f=first;
?
Marsh Posté le 11-01-2003 à 00:24:52
je crois que tu as lu un peu vite ma réposne précédente
mais remarques vise pas un bout de code particulier, mais l'ensemble. considères en une et regarde l'ensemble de ton code...
les namespace... il est ard: rajoute ça "using namespace std;" juste apres tes #include
Citation :
|
c'est strictement équivalent, personnellement je préfère la premiere ecriture (bien entendu ici, le = n'a donc rien avoir avec operator=)
Marsh Posté le 11-01-2003 à 00:37:50
Citation : les namespace... il est ard: rajoute ça "using namespace std;" juste apres tes #include |
je ne sais pas ce que c'est, ça sert a quoi ?
Marsh Posté le 11-01-2003 à 05:47:33
++Taz a écrit : muni tes objets d'une méthode clone()
|
J'ai pas lu tout le topic, mais je me pose une question :
si je veux que ma liste soit sur des références, ou des pointeurs, je fait comment pour ajouter clone() au type (MaClasse &) ou (MaClasse *) ??
Marsh Posté le 11-01-2003 à 06:01:31
karim63 a écrit :
|
Rahaaaaa putaint de ta race, je passe ma vie à t'expliquer la différence entre initialisation et instanciation, et tu écris des merdes pareilles ????
C'est un putain de constructeur par copie, tu n'affectes pas les variables d'instance dans un constructeur tu les initialises (avec des putains de ":", deux point en français, colon in english, jamais avec "=", égal en français, equal in english) :
Code :
|
Fait-moi plaisir, imprime un truc dans ta vie : la différence entre initialisation (la variable ne contenait aucune valeur significative avant) et affectation (la variable change de valeur).
Marsh Posté le 11-01-2003 à 07:40:11
nraynaud a écrit : |
ben comme je le propose, il faut introduire une double spécialisation de template par l'intermédiaire d'une classe wrapper&clone. le problème c'est surtout la sémantique: je ne vois pas trop l'interet d'avoir une fonction membre clone a part pour le polymorphisme qui se fait grace aux pointeurs en C++
Marsh Posté le 11-01-2003 à 14:02:54
Citation : Fait-moi plaisir, imprime un truc dans ta vie : la différence entre initialisation (la variable ne contenait aucune valeur significative avant) et affectation (la variable change de valeur). |
hé connard tu vas parler sur un autre ton ??
Ce que je comprends et pas avec tes explications(y en a pas), c'est que si j'affecte a un attribut non instanticé un objet avec = , si il est pas initiliasié ça peut merder lors du vidage de l'objet censé ecrasé.
Soit plus clair dans tes explications. Il suffit pas de dire ce qu'il faut faire, il faut aussi dire pourquoi sinon ça sert a rien.
Marsh Posté le 11-01-2003 à 14:43:34
karim63 a écrit :
|
http://forum.hardware.fr/forum2.ph [...] t=#t272543
ho bah t'as raison, c'est une choucroute volante, j'ai cru que c'était une explication. A la page précédente, j'avais déjà fait la remarque (rapidement).
Marsh Posté le 11-01-2003 à 14:52:43
++Taz a écrit :
|
C'est pas plutôt
Code :
|
Code :
|
Marsh Posté le 11-01-2003 à 15:15:17
ben c'est à peu pres la meme chose, a moins que ta sémantique de operator= soit differente de celle communément utilisée
Marsh Posté le 11-01-2003 à 15:26:50
++Taz a écrit : ben c'est à peu pres la meme chose, a moins que ta sémantique de operator= soit differente de celle communément utilisée |
C'est pas la mienne mais la tienne ... (si c'est vrai, nananère)
Marsh Posté le 11-01-2003 à 21:07:58
*s'imagine une choucroute qui vole*...beuurkkk
*se demande si la choucroute garde sa cohésion lorsqu'elle dépasse la vitesse du son*...
Marsh Posté le 11-01-2003 à 21:24:38
Galett a écrit : *s'imagine une choucroute qui vole*...beuurkkk |
http://kadreg.free.fr/perso/moules [...] olante.jpg
Marsh Posté le 12-01-2003 à 04:45:47
nraynaud a écrit : C'est pas plutôt
|
Pour un type intégré, k reçoit la valeur de i après affectation (plus précisément, la valeur de j convertie dans le type de i).
Donc, si on veut être cohérent, on doit renvoyer le type affecté si celui-ci est différent du type lu.
Mais surtout, l'objet lu peut être un objet temporaire généré par le compilateur (issu d'une conversion implicite par exemple).
Renvoyer une référence de ce temporaire peut être catastrophique s'il est supprimé par le compilateur dès la première affectation accomplie.
Code :
|
C'est le fait que l'argument soit const qui autorise à transmettre un temporaire à une référence. Un truc tordu !
Donc, on n'a en fait pas le choix si on renvoie des références:
Code :
|
Marsh Posté le 12-01-2003 à 16:05:22
ok, j'ai ma réponse
Marsh Posté le 12-01-2003 à 16:23:00
Musaran a écrit :
|
Tu es très loin de m'avoir convaincu, si le compilo te file à affecter une valeur temporaire (qu'il a créé de façon implicite en plus), il se démerde, c'est à lui de te filer des trucs qui vont durer au moins jusqu'à la fin du scope de la variable.
Par contre, le feit que = renvoie l'ancienne valeur contenue dans la variable et pas la nouvelle, ça me parraît nettement plus grave, c'est une rupture de contrat.
Marsh Posté le 12-01-2003 à 22:10:37
Citation : Tu es très loin de m'avoir convaincu, si le compilo te file à affecter une valeur temporaire (qu'il a créé de façon implicite en plus), il se démerde, c'est à lui de te filer des trucs qui vont durer au moins jusqu'à la fin du scope de la variable. |
Oui mais dans ce cas la ce n'est plus la responsabilite du compilateur. L'operateur = est de la responsabilite du programmeur qui l'a surcharge. Et malheureusement on ne peut pas l'empecher d'ecrire n'importe quoi.
Citation : Par contre, le feit que = renvoie l'ancienne valeur contenue dans la variable et pas la nouvelle, ça me parraît nettement plus grave, c'est une rupture de contrat. |
Ce qui me paraitrait bizarre plutot c'est qu'a la fin de l'operation d'affectation on aurait *this qui vaudrait toujours son ancienne valeur alors que normalement on voudrait qu'elle soit egale a celle de la reference passee en parametre.
Bref si l'operateur = est bien ecrit et qu'il renvoie
une reference constante vers *this alors le contrat
est bien respecte imho.
LeGreg
Marsh Posté le 12-01-2003 à 22:25:09
legreg a écrit : |
L'ancienne valeur reçoit le message = avec comme argument la nouvelle valeur et, dans la fonction, il n'y a rien de magique qui te permette de faire toi-même l'affectation, par contre on te prévient qu'il y a affectation (de qui sur qui), et que si tu as quelquechose à faire, c'est maintenant ou jamais. On te file pas un pointeur sur la varible et la nouvelle valeur en disant "tiens vas-y affecte", mais on te donne la possibilité de t'accrocher à l'événement affectation.
Marsh Posté le 12-01-2003 à 22:53:22
heink??
J'ai beau retourner ta phrase dans tous les sens??
LeGreg
Marsh Posté le 12-01-2003 à 22:59:09
legreg a écrit : heink?? |
Je réessaye : L'opérateur = n'est pas destiné à faire une affectation. Il sert de handler qui sera appelé au moment de l'affectation, mais on te demande pas physiquement de faire la copie dedans. C'est juste que si tu as un truc à faire au moment de l'affectation, tu le fais dedans, c'est tout.
mon vieux pointeurs-intelligents pour un exemple :
http://forum.hardware.fr/forum2.ph [...] t=#t268792
Marsh Posté le 12-01-2003 à 23:14:38
nraynaud a écrit : |
Oui mais si lors d'une affectation tu decides de ne rien faire lors de cette affectation c'est tout de meme pervers non ?
Citation : Pointeur operator = (Pointeur r) { // ici est toute la feinte |
Quoique j'ai du mal a faire le lien entre ton affirmation
quotee et ce bout de code ou tu fais les choses volontairement mal apparemment mais ca devrait tout de meme marcher (en partie grace aux recopies inutiles..).
LeGreg
Marsh Posté le 12-01-2003 à 23:43:37
legreg a écrit :
|
si tu décides de ne rien faire, tu ne fais rien, tu ne surcharges même pas = et ça va s'affecter tout seul (d'ailleur, même si tu surcharges et que tu mets un corps vide ça va le faire aussi), je vois pas la question.
Gni ??? c'est n'importe quoi ce code ! Y'a un mec qui m'a fait chier avec des références à la con mais il est pas capable de voir ça.
Bon, correction :
Code :
|
donc dans cette version, on ne touche pas aux objets eux-même , on ne fait même rien passer de l'un à l'autre, on fait juste des actions justifiées par l'imminence d'une affectation.
Marsh Posté le 12-01-2003 à 23:48:29
ah ben si ca marche apres ta "correction"
ce sera tout de meme un sacre miracle..
Bon je retourne bosser. Bonne nuit a vous.
LeGreg
Marsh Posté le 13-01-2003 à 01:18:21
Après documentation, je me suis planté.
En fait il assigne tous les champs un par un et il gueule s'il trouve un const ("non-static const member `const int A::i', can't use default assignment operator" ). C'est ce const qui m'a fait planter, je pensais qu'il virait l'objet de la case et qu'il en foutait un nouveau à la place.
Marsh Posté le 13-01-2003 à 12:56:10
nraynaud a écrit : si le compilo te file à affecter une valeur temporaire (qu'il a créé de façon implicite en plus), il se démerde, c'est à lui de te filer des trucs qui vont durer au moins jusqu'à la fin du scope de la variable. |
Quelle variable ?
Si c'est l'argument de la fonction, c'est le cas : elle est détruite avant même la fin de l'expression.
Si c'est 'i' dans 'i=j=0', ça ne colle pas avec un principe du C++: ce qui se passe après dans l'expression n'influence pas ce qui s'y passe avant.
'i=(j=0)': j=0 produira toujours la même chose, qu'il soit précédé de i= ou pas.
Je répète que le mélange valeur temporaire et référence const est... spécial.
Ajouté à l'opérateur = qui est des plus compliqués, c'est pas de la tarte !
Citation : Par contre, le feit que = renvoie l'ancienne valeur contenue dans la variable et pas la nouvelle, ça me parraît nettement plus grave, c'est une rupture de contrat. |
Je te comprends pas là.
'return' venant logiquement à la fin de la fonction, l'affectation est accomplie, et la nouvelle valeur (adaptée) renvoyée.
Citation : tu ne surcharges même pas = et ça va s'affecter tout seul (d'ailleur, même si tu surcharges et que tu mets un corps vide ça va le faire aussi) |
Non, dès qu'on déclares soi-même l'affectation on est responsable de tout copier.
On peut cependant s'appuyer sur l'affectation de la classe héritée.
Marsh Posté le 13-01-2003 à 13:05:09
Musaran a écrit : Quelle variable ?
Je te comprends pas là.
Non, dès qu'on déclares soi-même l'affectation on est responsable de tout copier. |
Laisse tomber, j'ai dit que des conneries, je me suis documenté depuis.
Marsh Posté le 15-01-2003 à 18:35:01
je voudrais implemetenter une fonctio de recherche, mais assez generale et qui pourrait porter sur des criteres que les objets de la listes doivent avoir.
par exemple une methode de recherche qui prend en parametre la valeure recherchée, et aussi l'attribut qui doit avoir cette valeur, ou bien une methode qui renvoit une valeur qui me permettra de faire la comparaison, et la fonction renverrait un pointeur sur cet objet par exemple.
si j'ai un objet avec comme attribut int A,B,C de pouvoir faire une recherche en disant sur quel attribut ce fait la recherche, plutot que de devoir faire 3 fonctions de recherche a chaque fois.
C'est possible ?
Marsh Posté le 16-01-2003 à 05:14:10
Il a posé la question dans un topic à part: http://forum.hardware.fr/forum2.php3?post=30891&cat=10
Marsh Posté le 17-01-2003 à 05:38:00
Tu poses ta question à deux endroits.
Comment se sentirait quelqu'un se donnant la peine de te répondre, pour découvrir que tu as déjà eu une réponse ailleurs ?
Marsh Posté le 17-01-2003 à 07:23:49
J'ai cahngé d'avis c tout.
Même si c'est pour continuer ce que j'ai fait dans ce thread, c'est pas forcement le même sujet.
Et pi c'est du second degr&é en plus.
Marsh Posté le 10-01-2003 à 22:14:26
comment dupliquer une liste de pointers ? (les objets pointés aussi).
pour stocker des elements dans une liste chainée generique avec templates (g fait l'implementation) afin de pouvoir stocker des classes et aussi des classes dérivées du type de base, j'utilise une liste chainée dont les noeuds contienent un champ avec la valeur du pointeur.
donc pour rentrer un element je dois faire l.add(new machin(bidule,truc))
Là je peux conserver le type reels de objets contrairement au cas ou j'utilise un attribut du type machin dans mon noeud.
Et donc je vois pas comment faire pour dupliquer la liste.
J'ai tenté des trucs avec typeof etc, mais le compilo (g++) subit une erreur interne, et il veut que j'envoit un mail
Mon but etait de faire une liste generique qu'il soit possible de dupliquer.
Message édité par karim63 le 15-01-2003 à 20:35:27