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

Résolu
Signaler
Messages postés
6
Date d'inscription
lundi 14 avril 2008
Statut
Membre
Dernière intervention
28 février 2009
-
Messages postés
6
Date d'inscription
lundi 14 avril 2008
Statut
Membre
Dernière intervention
28 février 2009
-
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

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Essaie la syntaxe E_A G(354.5); et E_A H("x+y");
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
En effet ca passe sous VC++ 8

C'est quoi ton WinDevC++?
_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
6
Date d'inscription
lundi 14 avril 2008
Statut
Membre
Dernière intervention
28 février 2009

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 ;
Messages postés
6
Date d'inscription
lundi 14 avril 2008
Statut
Membre
Dernière intervention
28 février 2009

Pardonnez , je voulais dire en haut que  les syntaxes  E_A G(354.5) et E_A H("x+y")  marchent sous WinDevC++ ;

Mais...
Messages postés
6
Date d'inscription
lundi 14 avril 2008
Statut
Membre
Dernière intervention
28 février 2009

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.