|
Page : 1 2 Page Précédente | |
Auteur | Sujet : appel du destructeur et opérateurs |
in_your_phion | Bonjour, je suis en train de faire des petites fonctions d'opérations basiques sur les matrices en c++. en gros j'ai une classe Matrix, et pour l'instant je me contente de faire de la surcharge d'opérateurs : +, =, * j'aurais deux petites questions siouplait... 1) j'ai fait un opérateur d'affectation = :
est-ce bien comme ça qu'il faut faire ? e.g recopier les données de m dans l'instance qui est affecté par l'opérateur = ? Que se passe t'il si on redéfini pas =, c'est juste une copie membre à membre ? cad :
? 2) Autrement j'ai une deuxième question ... là je comprend pas du tout... J'ai donc fait mes opérateurs et j'ai testé ça dans mon main :
ca marche, sauf que il y a deux appel au destructeur après la ligne 3 et je ne sais pas d'ou ils sortent j'obtiens donc ceci :
pourquoi ces appels au destructeur ..?? merci par avance.. Message cité 1 fois Message édité par in_your_phion le 30-04-2008 à 23:16:46 |
![]() Publicité | Posté le 30-04-2008 à 23:16:19 ![]() ![]() |
skeye | Les appels au destructeur sont faits automatiquement à la disparition de l'objet... --------------- Can't buy what I want because it's free - |
Joel F Real men use unique_ptr |
après bon, les tableaux 1D ....
Message cité 1 fois Message édité par Joel F le 01-05-2008 à 10:45:52 |
skeye | ah tiens, j'avais mal compris la question, mais je comprends la réponse au moins . Message édité par skeye le 01-05-2008 à 10:46:42 --------------- Can't buy what I want because it's free - |
Ace17 |
Le probleme ne serait-il pas plutot que l'operateur * renvoie un objet temporaire qui est detruit apres l'affectation?
|
Joel F Real men use unique_ptr | ca expliquerait un appel au destructeur, le 2e viendrait d'où.
|
in_your_phion |
merci pour vos réponses Merci Joel pour l'explication sur l'opérateur =. Voici l'opérateur * que j'ai implémenté :
j'ai bon ...? (edit : est ce qu'on peut surcharger un opérateur () et ensuite l'utiliser dans un autre surcharge d'opérateur ? par exemple dans mon cas ce serai plus pratique de faire m(i,j) plutot que m[j +i*m.cols] mais ça a pas l'air de marcher, y'a til un moyen ?) Message édité par in_your_phion le 02-05-2008 à 00:46:33 |
Joel F Real men use unique_ptr | operator* est canoniquement implanté sous forme 'une fonction libre et non d'une fonction membre. Ensuite ... OMG punaise les lignes 7-9, quelle horreur ! Alors maintenant question : sinon oui operartor() se surcharge sans probleme. Message cité 1 fois Message édité par Joel F le 02-05-2008 à 08:34:45 |
Taz bisounours-codeur | Un papier bien avec une exemple de multiplication de matrice efficace http://people.redhat.com/drepper/cpumemory.pdf §6.2 Déjà, si ton _data c'était un vector, t'aurais même pas à te poser la question d'operator=, etc Message édité par Taz le 02-05-2008 à 13:14:35 |
in_your_phion |
salut, merci pour vos réponses encore 1 fois @Joel F ok pour les lignes 7 à 9 ... en fait mon constructeur initialise la matrice avec un rand donc c'est pour ca que je l'ai pas appelé dans operator* ... dans ce cas c'est peut etre mon constructeur qui est foireux 'cf plus bas). MAis sinon je comprends toujours pas pourquoi j'ai deux appels au destructeur .. ps : pour operator(), je voulais savoir si je peux l'utiliser dans operator* merki! ps : voici TOUT mon code (dans le .h) :
ps : la ligne 82 me génère l'erreur suivante :
ce serait pas plutot
? Message édité par in_your_phion le 02-05-2008 à 18:10:57 |
![]() Publicité | Posté le 02-05-2008 à 17:55:24 ![]() ![]() |
Joel F Real men use unique_ptr | je réponds plus tant que tu arretera pas d'utiliser char* et T* au lieu de string et de vector<T>.
|
in_your_phion |
|
Taz bisounours-codeur |
Joel F Real men use unique_ptr | et je maintiens que * est canoniquement une fonction libre qui utilise la fonction membre += |
Taz bisounours-codeur |
|
Joel F Real men use unique_ptr | pour le papier j'en cherche encore. Si j'en trouve pas j'en ecrirais un |
Taz bisounours-codeur | Pour une matrice, bah oui ça peut, mais ça change pas mal la tronche de matrice, tu ne peux pas faire la multiplication sur place |
Joel F Real men use unique_ptr | Certes, je sais plus comment j'ai contourner le probleme dans NT2 |
Taz bisounours-codeur | Ouais enfin bon, tu vois le dilemne operator?= / operator? / friend / etc |
Taz bisounours-codeur | bref tu vois quoi comme forme canonique quand operator?= ne s'implémente en fait qu'en utilisant operator? ? |
Taz bisounours-codeur | oui |
in_your_phion |
|
Taz bisounours-codeur |
in_your_phion |
|
Joel F Real men use unique_ptr | Matrix operator+(const Matrix & m) const
|
Joel F Real men use unique_ptr | c'est pas prévu par le standard. gcc le fait mais pas VC++ (ou l'inverse) |
jesus_christ votre nouveau dieu | http://www.cplusplus.com/doc/tutorial/dynamic.html
|
jesus_christ votre nouveau dieu | et même chez microsoft :
|
Joel F Real men use unique_ptr | ah ok ^^ c'est le delete d'un unallocated pointer qui chouine, OK |
in_your_phion |
ok merci pour vos réponses. Puisqu'on parle de la STL, j'ai une petite autre question siouplé... j'aimerai savoir si c'est la bonne manière de déclarer un tableau 2D de vector avec la stl. Et surtout, est ce que ca a du sens de déclarer un pointeur vers un vecteur, car dans mon exemple c'est pas un pointeur mais je sais pas comment faire si c'est un pointeur. Voila l'exemple :
? si oui comment je peux initialiser ce pointeur ... merci d'avance Message édité par in_your_phion le 10-05-2008 à 02:59:49 |
Joel F Real men use unique_ptr | vector<vector<int> > suffit, mais c'est inefficace, mattes du coté de boost::multi_array |
jesus_christ votre nouveau dieu |
Message cité 1 fois Message édité par jesus_christ le 10-05-2008 à 10:07:28 |
in_your_phion |
|
jesus_christ votre nouveau dieu | un petit exemple là, mais valarray est peu documenté et assez dur à utiliser, mais les implémentations sont très performantes.
|
![]() Publicité | Posté le ![]() ![]() |
Page : 1 2 Page Précédente |