Problème transtypage

Résolu
s2pawn Messages postés 10 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 5 décembre 2009 - 21 nov. 2009 à 12:12
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

13 réponses

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
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
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 nov. 2009 à 13:29
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 ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 nov. 2009 à 13:31
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".
0
s2pawn Messages postés 10 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 5 décembre 2009
21 nov. 2009 à 13:47
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));
}
0

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

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 nov. 2009 à 14:27
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.
0
s2pawn Messages postés 10 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 5 décembre 2009
21 nov. 2009 à 14:51
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 ^^
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 nov. 2009 à 14:55
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".
0
s2pawn Messages postés 10 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 5 décembre 2009
21 nov. 2009 à 15:07
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
0
s2pawn Messages postés 10 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 5 décembre 2009
21 nov. 2009 à 15:11
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 nov. 2009 à 15:17
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();
0
s2pawn Messages postés 10 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 5 décembre 2009
21 nov. 2009 à 15:31
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
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 nov. 2009 à 18:17
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.
0
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:10
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
0
Rejoignez-nous