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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1218516
Master_Jul
Posté le 08-10-2005 à 22:36:07  profilanswer
 

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
mood
Publicité
Posté le 08-10-2005 à 22:36:07  profilanswer
 

n°1218543
++fab
victime du syndrome IH
Posté le 08-10-2005 à 23:19:34  profilanswer
 

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}" )

n°1218601
Master_Jul
Posté le 09-10-2005 à 08:14:05  profilanswer
 

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
n°1218618
Joel F
Real men use unique_ptr
Posté le 09-10-2005 à 10:15:14  profilanswer
 

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

n°1219114
++fab
victime du syndrome IH
Posté le 09-10-2005 à 23:11:01  profilanswer
 

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.

n°1219155
Master_Jul
Posté le 10-10-2005 à 00:15:40  profilanswer
 

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

n°1219158
++fab
victime du syndrome IH
Posté le 10-10-2005 à 00:30:45  profilanswer
 

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 ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Changer l'epaisseur d'un trait /creer une gomme sous visual basic 6comment est-ce qu'on peut changer la couleur des écriture sur Visual C
[VISUAL] ajouter une aide dans le dynamic helpProblème simple
j'ai besoin d'une alerte simple en javascriptquestions bêtes sur l'utilisation de visual C++ (librairies)
utilisation de classe friendComment peut on faire deplacer le curseur sur Visual Studio C/C++
Un truc surement simple a faire[Resolu][JS] probleme simple de portée de variable[Résolu]
Plus de sujets relatifs à : Petite classe simple compile sous Visual mais pas g++.


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