Petite classe simple compile sous Visual mais pas g++.

Petite classe simple compile sous Visual mais pas g++. - C++ - Programmation

Marsh Posté le 08-10-2005 à 22:36:07    

Bonjour,
 
J'ai le classique problème des vecteurs qui me donne du fil à retordre car d'habitude je l'écris sous Visual C++ mais je dois maintenant le compiler avec g++ et ça ne donne pas le même résultat. Ca ne marche pas car les arguments ne sont pas vus du même type.
 

Code :
  1. // main.cpp
  2. #include "Vecteur.h"
  3. #include <iostream>
  4. using namespace std;
  5. int main()
  6. {
  7. Vecteur v10="(1,2,3)";
  8. return 0;
  9. }


 

Code :
  1. // Vecteur.h
  2. #include <iostream>
  3. using namespace std;
  4. class Vecteur
  5. {
  6. private:
  7. float* tab;
  8. int taille;
  9. public:
  10. Vecteur() {taille=0;tab=NULL;}
  11. Vecteur(Vecteur& );
  12. Vecteur(char*);
  13. Vecteur& operator =(Vecteur& );
  14. Vecteur& operator =(char*);
  15. Vecteur& operator +=(Vecteur& );
  16. Vecteur operator +(Vecteur& );
  17. float& operator [](int);
  18. friend ostream& operator <<(ostream&, Vecteur& );
  19. ~Vecteur() { delete[] tab;}
  20. };


 
Extrait de l'implémentation :

Code :
  1. // Vecteur.cpp
  2. #include "Vecteur.h"
  3. #include <iostream>
  4. using namespace std;
  5. Vecteur::Vecteur(Vecteur& vect)
  6. {
  7. int i;
  8. taille=vect.taille;
  9. tab=new float[taille];
  10. for(i=0;i<taille;i++)
  11.  tab[i]=vect.tab[i];
  12. }
  13. Vecteur::Vecteur(char* mytab)
  14. {
  15. int i,j=0;
  16. taille=(int)(strlen(mytab)-1)/2; // string.h ?
  17. tab=new float[taille];
  18. for(i=1;i<(int)strlen(mytab)-1;i++)
  19.  if(mytab[i]!=',')
  20.   tab[j++]=(float)mytab[i]-48; // Attendant de trouver un cast propre
  21. }
  22. Vecteur Vecteur::operator +(Vecteur& vect)
  23. {
  24. int i;
  25. Vecteur Resultat;
  26. Resultat.taille=vect.taille;
  27. Resultat.tab=new float[taille];
  28. for(i=0;i<vect.taille;i++)
  29.  Resultat.tab[i]=vect.tab[i]+tab[i];
  30. return Resultat;
  31. }
  32. Vecteur& Vecteur::operator =(Vecteur& vect)
  33. {
  34. int i;
  35. if(this!=&vect)
  36. {
  37.  if(taille!=0)
  38.   delete[] tab;
  39.  taille=vect.taille;
  40.  tab=new float[taille];
  41.  for(i=0;i<taille;i++)
  42.   tab[i]=vect.tab[i];
  43. }
  44. return *this;
  45. }


 
Et l'erreur :

10 C:\vecteurv\main.cpp no matching function for call to `Vecteur::Vecteur(Vecteur)'  
 note C:\vecteurv\Vecteur.h:13 candidates are: Vecteur::Vecteur(char*)  
 note C:\vecteurv\Vecteur.h:13                 Vecteur::Vecteur(Vecteur& )


 
Et ça marche parfaitement sous Visual. Bon certains diront que ce n'est pas une référence mais j'aimerais bien savoir comment faire fonctionne cela avec g++.
 
Merci !


Message édité par Master_Jul le 08-10-2005 à 22:44:11
Reply

Marsh Posté le 08-10-2005 à 22:36:07   

Reply

Marsh Posté le 08-10-2005 à 23:19:34    

g++ à raison.
Quelle version de visual ?
 
Vecteur v10="{1,2,3}" appelle le constructeur de copie.
vu que Vecteur dispose d'un constructeur Vecteur(char*) non explicit, tu autorise alors une conversion implicite char* <-> Vecteur.
Il y a donc création d'un objet Vecteur temporaire Vecteur("{1,2,3}" ). Or, ton constructeur de copie est déclaré comme cela : Vecteur ( Vecteur& ) ,ce qui est catastrophique. Or il est illégal d'assigner un temporaire à une référence non const, la norme est claire la dessus il m semble.
 
Donc tu sais ce qu'il te reste à faire ...

Spoiler :

mettre des const ! Utiliser la construction Vecteur v10("{1,2,3}" )

Reply

Marsh Posté le 09-10-2005 à 08:14:05    

Merci beaucoup pour ton explication très pédagogue ++fab, c'est comme ça que l'on progresse. Il s'agit de la dernière version .NET beta 2.
 
:hello:
 
Edit : Une petite précision s'il te plaît, qu'entends-tu par conversion non explicite ?
 
Quelle est la différence entre
vecteur v2("(1,2,3)" );
et vecteur v2="(1,2,3)";
 
(les deux semblent fonctionner depuis que j'ai ajouté le const au constructeur par copie)
 
Dans la première écriture, celle que tu m'as proposé, je comprends mieux ce qu'il se passe (passage par le constructeur de recopie). En fait, j'avais essayé de mettre un const, mais pour le char*. :sweat:

Message cité 1 fois
Message édité par Master_Jul le 09-10-2005 à 08:22:25
Reply

Marsh Posté le 09-10-2005 à 10:15:14    

HS : y a moins laid que
v1 = "(1,2,3)";
 
http://forum.hardware.fr/hardwaref [...] 0342-1.htm

Reply

Marsh Posté le 09-10-2005 à 23:11:01    

Master_Jul a écrit :

Quelle est la différence entre
vecteur v2("(1,2,3)" ); (1)
et vecteur v2="(1,2,3)"; (2)


 
(1) appelle le constructeur Vecteur( char* ) directement.
(2) passe par le constructeur de copie comme expliqué ci dessus.
 

Citation :

Edit : Une petite précision s'il te plaît, qu'entends-tu par conversion implicite ?


le cas (2). Si tu avais déclaré ton constructeur comme ceci : explicit Vecteur( char* );
La création du temporaire Vecteur("{1,2,3}" ) ne se serait pas faite automatiquement à partir de "{1,2,3}".
Si tu fournis un constructeur pouvant prendre un paramètre, et non précédé du spécificateur explicit, alors tu autorises une conversion implicite du type du paramètre vers le type Vecteur.

Reply

Marsh Posté le 10-10-2005 à 00:15:40    

Ok, merci beaucoup. :jap: Ca tombe bien, j'ai TP demain, cette aprem'. Je vais pouvoir expérimenter tout ça. :)

Reply

Marsh Posté le 10-10-2005 à 00:30:45    

Master_Jul a écrit :

Ok, merci beaucoup. :jap: Ca tombe bien, j'ai TP demain, cette aprem'. Je vais pouvoir expérimenter tout ça. :)


 
Alors tu vas probablement te rendre compte que ça ne fonctionne apparemment pas comme je te l'ai dis. Et pourtant, j'ai quand même raison ... pourquoi ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed