Problème transtypage [Résolu]

Messages postés
10
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
5 décembre 2009
- - Dernière réponse : s2pawn
Messages postés
10
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
5 décembre 2009
- 21 nov. 2009 à 19:14
Bonjour

je commence le développement d'un jeu d'échec en mode console pour apprendre le c++
je rencontre des difficultés avec le transtypage.
j'ai des classes (roi, reine...) qui hérite de piece, et quand je veux initialiser les joueurs
avec les pieces a leurs position initiale, il me retourne le type d'une piece^^ alors que pourtant il utilise bien le bon constructeur
Je sais pas si je suis clair :)

voici mon source http://www.gigaup.fr/?g=PF636ZDAJJ

merci d'avance
Afficher la suite 

13 réponses

Meilleure réponse
Messages postés
10
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
5 décembre 2009
3
Merci
c'est bon j'ai trouvé^^
voici la solution

void
Joueur::placerPieces( Echiquier & echiquier )
{
 for ( int i = 0; i < 16; ++i )	

echiquier.placer( m_pieces[i]);   
}


j'avais deja testé cette solution mais y avait rien qui s'affichait sur l'échiquier :) c'était surment car je n'avais pas mis virtual

je te remercies pour tout, j'ai beaucoup progressé grâce à toi

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 196 internautes nous ont dit merci ce mois-ci

Commenter la réponse de s2pawn
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
Je sais pas si je suis clair :)

Non, désolé mais je ne comprends pas ta question.

J'ai essayé d'utiliser ton programme, mais il n'est pas explicite, et on ne sait pas quoi faire avec (ça semble ne pas fonctionner et il tourne dans l'air). L'utilisation est peu dur, car mal expliquée.

Au niveau du code, il y a beaucoup de trucs "moches":
"(white ? true : false)" au lieu de "white"
"if (truc == false)" au lieu de "if (!truc)"
"if (truc == true)" au lieu de "if (truc)"
"using namespace std;" => beurk. A ne jamais utiliser. Tu n'est pas à 3 caractères près tout de même ? Si néanmoins tu veux ne pas écrire "std::", préfère "using std::cout; using std::cin; using std::string; etc..." dans une portée limitée (cad à l'intérieur d'un namespace, d'une fonction).

Extension des fichiers: Il y a soit le couple: .cc/.hh, soit le couple .cpp/.hpp, mais le couple .cxx/.h c'est peu commun.

Pourrais-tu expliquer précisément ce qui ne vas pas, en joignant juste un petit extrait de code qui ne fonctionne pas comme tu le souhaites ?
Commenter la réponse de cptpingu
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
Ah j'oubliais:

Lorsque tu boucles avec des itérateurs, ne fait pas "i++", mais "++i".
Niveau performance il peut y avoir une grande différence !

En effet, ++i veut dire "incrémenter l'objet i", alors que i++ veut dire "copier l'objet i, incrémenter la copie puis réassigner cette copie à i".
Commenter la réponse de cptpingu
Messages postés
10
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
5 décembre 2009
0
Merci
merci pour les info :)

il est loin d'être fini et il est vrais que je ne l'ai pas commenté, le probleme que j'éssai de régler pour l'instant c'est le fait qu'il m'affiche correctement les 2 echiquiers (variante alice), mais que sur le premier au lieu de me mettre 'TCFRQFCT' il me met le type d'une piece 'NNNNNNNN'
donc je pense que c'est un problème de transtypage mais j'ai du mal a l'utiliser correctement
voici ce que je fais pour l'instant pour initialiser les joueurs :


void
Joueur::init( bool white )
{

m_pieces[0] = Roi(5, (white ? 1 : 8),(white));
m_pieces[1] = Reine(4, (white ? 1 : 8),(white));
m_pieces[2] = Tour(1, (white ? 1 : 8),(white));
m_pieces[3] = Tour(8, (white ? 1 : 8),(white));
m_pieces[4] = Fou(2, (white ? 1 : 8),(white));
m_pieces[5] = Fou(7, (white ? 1 : 8),(white));
m_pieces[6] = Cavalier(6, (white ? 1 : 8),(white));
m_pieces[7] = Cavalier(3, (white ? 1 : 8),(white));
for(int i = 8; i < 16; i++)
m_pieces[i] = Pion(i-7, (white ? 2 : 7),(white));
}
Commenter la réponse de s2pawn
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
Tu as oublié de marquer les méthodes comme virtual.

"char myType();" => "virtual char myType();"

virtual veux dire: En cas d'héritage, me prendre moi, pas la méthode au-dessus de moi, utilisé pour faire un masque de type.
En gros, si tu ne mets pas virtual et que tu es dans le cas d'un "upcasting", c'est à dire que tu as fait rentrer "Fou" dans "Piece", il ira chercher le myType le plus haut, c'est à dire Piece::myType. En mettant virtual, tu lui dit "Non, je veux que tu prennes le type de remplacement, et non celui au même niveau". Donc si tu mets virtual, il ira chercher (virtual) Fou::myType.
Commenter la réponse de cptpingu
Messages postés
10
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
5 décembre 2009
0
Merci
merci sur la précision pour virtual
mais on dirais que ça ne résoud pas le problème, il faut juste que je modifie le .h non?
je pense que je dois modifier aussi :

m_pieces[0] = Roi(5, (white ? 1 : 8),(white));

mais je ne sais pas comment

merci ^^
Commenter la réponse de s2pawn
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
Piece m_pieces[16];

Mets plutôt un:

Piece* m_pieces[16];

avec:

m_pieces[0] = new Roi(5, (white ? 1 : 8), white);

Sinon, il n'y a pas "d"upcasting", mais une copie simple. Donc ce qu'il y a dans le tableau est vraiment une "Piece" et pas un "Roi" masqué en "Piece".
Commenter la réponse de cptpingu
Messages postés
10
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
5 décembre 2009
0
Merci
j'avais deja essayé cette solution voici l'erreur qu'il me retourne a la compilation

Joueur.cxx: In member function ‘void Joueur::affiche()’:
Joueur.cxx:53: erreur: request for member ‘affiche’ in ‘((Joueur*)this)->Joueur::m_pieces[i]’, which is of non-class type ‘Piece*’
Joueur.cxx: In member function ‘void Joueur::placerPieces(Echiquier&)’:
Joueur.cxx:61: erreur: no matching function for call to ‘Echiquier::placer(Piece**)’
Echiquier.h:51: note: candidats sont: bool Echiquier::placer(Piece*)
Joueur.cxx: In member function ‘bool Joueur::isWhite()’:
Joueur.cxx:91: erreur: request for member ‘isWhite’ in ‘((Joueur*)this)->Joueur::m_pieces[0]’, which is of non-class type ‘Piece*’

merci pour le temps que tu me consacre, c'est très sympa de ta part
Commenter la réponse de s2pawn
Messages postés
10
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
5 décembre 2009
0
Merci
peut etre mieux comme ceci :

http://img682.imageshack.us/i/capturespawnspawndeskto.png/
Commenter la réponse de s2pawn
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
C'est normal, les méthodes qui utilisent des "Piece", doivent utiliser des "Piece*".

Change aussi certains trucs:
m_pieces[ i ].affiche();

m_pieces[ i ]->affiche();
Commenter la réponse de cptpingu
Messages postés
10
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
5 décembre 2009
0
Merci
c'est ce que j'avais compris en lisant le rapport mais le probleme c'est que cela provoque de nouvelles modification à apporter.



je ne comprend pas pourquoi il me met Echiquier::placer(Piece**) y a qu'une * pourtant
me suis dit alors que c'est la methodes placer pieces qui pose probleme, mais même si j'enleve le passage par & pose toujours probleme
je suis vraiment trop mauvais, la notion de pointeur est très compliqué a comprendre je trouve

merci encore

je continu à chercher
Commenter la réponse de s2pawn
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
Il s'attend à ceci:

Joueur::placerPieces( Echiquier & echiquier )


Donc soit tu fais:

Joueur::placerPieces( Echiquier* echiquier )



Soit tu donnes une référence à placer placerPieces:

Piece* p = ...
e.placerPieces(*p);


En fait, le & veut dire que tu vas chercher "l'adresse de" Piece. Donc au lieu de lui passer un pointeur, tu lui passes l'objet (* veut dire devenir ce que pointe le pointeur, donc il devient l'objet).
Une fois que tu as l'objet "*p", le & en prendra l'adresse.
Commenter la réponse de cptpingu
Messages postés
10
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
5 décembre 2009
0
Merci
je viens de tester les solutions que tu m'as proposé
pour la premiere :
void
Joueur::placerPieces( Echiquier * echiquier )
{
 for ( int i = 0; i < 16; ++i )	

    echiquier.placer( m_pieces + i);
}


j'ai comme resultat :


pour la seconde solution, j'ai déclaré
Piece *p;
dans le .h
puis j'ai fait :
void
Joueur::placerPieces( Echiquier & echiquier )
{
 for ( int i = 0; i < 16; ++i )	
p = (m_pieces + i);
echiquier.placer(*p);    
}


et le résultat est le même que lorsque je ne donnais pas de référence à placer :


si tu pouvais encore me faire part de ton savoir merci d'avance
Commenter la réponse de s2pawn