Changement de type

Ensias Messages postés 31 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 15 décembre 2006 - 31 déc. 2005 à 12:52
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008 - 3 janv. 2006 à 07:06
Est ce qu'on peut changer le type d'une variable à l'execution d'un programme c++ .Par exemple donnez le choix à l'utilisateur de choisir le type qu'il veut donnez à une variable: entier,reel,ou string.
Merci

4 réponses

neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
1 janv. 2006 à 10:00
Tu peux créer une classe qui peut changer de type, du moins virtuellement.

Tu peux aussi utiliser les UNION:



union MonUnion

{

int a;

float b;

char* c;

};



C'est comme une structure, sauf que l'emplacement mémoire de chaque
champ est le même, donc si tu ecrit dans a, tu perd b et c, si tu ecrit
dans b, tu perd a et c.... Si tu essaye de lire a et que tu viend
d'écrire dans b, tu aura une valeur bizarre, a toi de faire attention
après...

neodelphi
0
Ensias Messages postés 31 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 15 décembre 2006
1 janv. 2006 à 10:13
Mais lorsque j'utilise un objet string dans une union le compilateur me genere une erreur.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 janv. 2006 à 12:07
Je pense que tu dois lire toujours une chaines, et ensuite tu regardes si ca correspond à un entier, un flottant ou une chaine normale. Je vois pas trop comment une union pourrait faire l'affaire ici
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
3 janv. 2006 à 07:06
Tu fait une classe CValue:



enum EValueCast

{

valueInt,

valueFloat,

valueString,

};



union UValueData

{

// Ce que j'ai marqué plus haut

};



class CValue

{

private:

EValueCast cast;

UValueData data;

public:

setInt(int newValue)

{

cast = valueInt;

data.a = newValue;

}

setFloat(...);

setString(...);

getInt(...);

getFloat(...);

etc...

};



Tu ajoute aussi des test lors de la lecture des valeurs, pour vérifier
que le type est le bon, et dans le cas contraire tu renvoi une erreur.



C'est bien plus rapide que de stocker tes valeurs dans un string et se
taper le décodage du string à chaque fois que tu veux modifier la
valeur ! L'avantage de l'union est que la mémoire est partagée et donc
tu n'utilise que la taille nécessaire et pas 4 fois plus si tu as 4
types possibles.

neodelphi
0
Rejoignez-nous