Problemes de conflit entre des constructeurs d'une meme Classe .

Résolu
manyim Messages postés 6 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 28 février 2009 - 14 avril 2008 à 20:29
manyim Messages postés 6 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 28 février 2009 - 16 avril 2008 à 16:40
J'ai des problemes de conflit avec des constructeurs d'une meme classe en C++ et j'utilise WinDevC++.à l'aide


//Je suis entrain de construire une classe E_A qui doit pouvoir //etre initialisé avec un nombre, ou une chaine de type char* ou

// avec une instance de dejà existente de la meme classe. J'ai donc
defini les trois constructeurs correspondants, ainsi que le
constructeur par defaut, mais aussi le constructeur de copie. Mais les
initialisations a partir des nombre et des chaines posent problemes.
voici tout le code :

#include

#include <vector>

#include <Math.h>

#include <cstdlib>

#include <string.h>

#include <sstream>

#include <stdio.h>

using namespace std ;


//-------------fonctions utilitaires-----------------------------...


inline char* copy(const char* q) //fait la copie de q dans p

{

if(q==NULL) return NULL;


int nbre=(strlen(q))+1 ;

char* p=new char[nbre] ;


strcpy(p,q);

return p;

}


//---------------------- fonctions de convertion vers le type chaine ----------------------------------


inline char* copy( string str) //----- convertion (string --> char*)

{

const char* q=str.c_str();

char* p=NULL;

return p=copy(q);

}


inline void IntToString( string& res , long i) // conversion int --> string

{

ostringstream temp;

temp << i;

res =temp.str( );

}


inline void doubleToString( string& res , double i) // convertion double --> string

{

ostringstream temp;

temp << i;

res = temp.str( );

}


char* intToCharPter(long i) // ecriture d'un long dans un char* convertion long --> char*

{

string st;

IntToString(st,i);

char *res=NULL;

res=copy(st);

return res;

}


char* intToCharPter(double i) // ecriture d'un double dans un char* convertion double --> char*

{

string st;

doubleToString(st,i);

char *res=NULL;

res=copy(st);

return res;

}


//--------------------- debut de classe E_A ----------------------------------------...


struct E_A

{

char* exp;


static char control ;


char* value()

{ char *p=copy(exp);

return p ;

}


void afficher(){cout << exp<< endl ; }


//les constructeurs

E_A(void) //construct par defaut;

{ exp="0";

}


E_A( char* chaine) // construction a partir d'une chaine

{ if(!chaine) exp="0";

else

if(!strlen(chaine))exp="0";

else exp=copy(chaine );

}


E_A(double nombre) //constuction à partir d'un nombre.

{

string tab;

doubleToString(tab,nombre) ;

exp=copy(tab);

}


E_A(E_A& Exp) //constructeur de copie

{

exp=copy(Exp.exp) ;


}


//surcharche des operateurs


void operator=(E_A& e1)

{ if(exp) delete[] exp ;

exp=copy(e1.exp);

cout << "On est dans la redefinition de = " << endl ;

}


void operator=(const char* e1)

{ if(exp) delete[] exp ;

exp=copy(e1) ;

cout << "On est dans la redefinition de = pour un char* " << endl ;

}


//le destructeur

~E_A()

{ delete exp ;

}


} ;


char E_A::control=1 ; //on contole toute affectation ;

//----------------fin de classe E_A-------------------------------------...


int main()

{

E_A E ; //ici il n'ya aucun probleme.


E_A F = E ; // ici non plus


// ICI EST LE PROBLEME.

// AUCUNE DES 3 INITIALISASATIONS SUIVANTES NE MARCHE. POURQUOI ?


//Win Dev C++ me dit qu'il ya 3 candidats possibles dans chaque cas.

// E_A::EA(E_A& ) , E_A:E_A(double) , E_A::EA(char*)

// Normalement, le constructeur E_A::EA(char*) est celui qui devrait

//etre appele. Mais Dev C++ ne le fait pas et m'affiche une erreur.

//comment puis-je resoudre le probleme ? Les trois constructeurs sont

//absolument necessaires pour la classe;


E_A G = 354.5 ; // Il proteste ici, alors que E_A::E_A(double) devrait etre appelé non ?


E_A H="x+y" ; //il proteste ici aussi, alors que E_A::E_A(char*) devrait etre appelé non ?


system("pause") ;

return 0 ;

}

6 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
14 avril 2008 à 21:10
Essaie la syntaxe E_A G(354.5); et E_A H("x+y");
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
15 avril 2008 à 17:48
E_A G = 354.5
E_A G(354.5)

C'est pas tout a fait équivalent. La première fait un appel implicite au constructeur E_A(double) puis c'est l'opérateur de copie  qui intervient. Or ton opérateur de copie est faux donc le pb vient sans doute de la.
E_A(const
E_A& Exp) //constructeur de copie

La deuxième écriture est plus explicite et appelle directement le bon constructeur.
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 avril 2008 à 20:38
En effet ca passe sous VC++ 8

C'est quoi ton WinDevC++?
_____________________________________
Un éditeur de ressources gratuit pour Windows
0
manyim Messages postés 6 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 28 février 2009
14 avril 2008 à 22:51
Merci vecchio et juju12. En effet les syntaxes  E_A G(354.5) et
E_A H("x+y")  . Malgré cela je ne m'explique pas  toujours
pourquoi WinDevC++ n'accepte pas les autres syntaxes, pourtant tres
légales et plus élegantes. La classe en question est destinée à être
utilisée plutard par le grand public. . Il est donc normal que chaque
utilisateur puisse initialiser ses instances selon les normes de
flexibilité de la  P.O.O. Les deux formes d'initialisation doivent
normalement marcher. De toute manière, je suis rassuré et tranquile.
j'ai compris par l'assistance des confreres  que c'est 
WinDev qui est un peu toqué. Je ne sais pas encore si la cause vient du
compilateur ou de mon propre ordinateur.

Merci poutout ;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
manyim Messages postés 6 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 28 février 2009
14 avril 2008 à 22:54
Pardonnez , je voulais dire en haut que  les syntaxes  E_A G(354.5) et E_A H("x+y")  marchent sous WinDevC++ ;

Mais...
0
manyim Messages postés 6 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 28 février 2009
16 avril 2008 à 16:40
Mille merci à toi  Luhtor !  cela  marche evidemment. Il faut voir comment l'oublie

d'une petite virgule peut bouleverser tout un programme !

Le probleme est definitivement resolu. merci à tous ceux qui ont voulu  apporter leur contribution.

                                                                        
0
Rejoignez-nous