Problème: tableau à 2 dimensions contenant des pointeurs.

Fermé
Hunken_V - 4 mars 2015 à 00:02
 JwTdd - 5 mars 2015 à 22:31
Bonjour,
j'ai beaucoup cherché sur internet et cependant je n'arrive pas à trouver la réponse à mon problème, j'ai essayé beaucoup de choses.
Je suis actuellement en train de programmer un jeu d'échec pour un projet d'informatique.

Dans le cadre de ce projet j'ai créé différentes classes: une classe virtuelle "piece" et des classe "pion","tour",...,"roi" qui héritent de la classe "piece". Je voulais représenter mon échiquier par un tableau 2D contenant des pointeurs de types "piece". Je joins ce que j'ai fait.



piece **u;
u = new piece*[8];
for(i=0; i<8; i++)
{
u[i] = new piece[8];
for(j=0; j<8; j++)
{
u[i][j]= NULL;
}
}


Ceci est pour la déclaration de l'échiquier (u). Ensuite, je comptai ajouté l'adresse d'une pièce de type "pion","tour",...,"roi" de la façon suivante:

tour tourb(1,0);
u[0][0] = &tourb;


(Voici l'exemple pour une tour)
Cependant ça ne marche pas. Merci d'avoir pris le temps de lire mon message, et merci d'avance pour vos réponses.

PS: si je suis passé à côté d'une question similaire, sur le site, pour pouvez me l'indiquer.

3 réponses

aramir Messages postés 939 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 26 décembre 2016 222
4 mars 2015 à 08:33
Bonjour, comment déclares tu tour? Et juste par curiosité pourquoi doit il avoir (1,0) en paramètre ?
0
Bonjour, merci de votre réponse.
Je déclare tour de la manière suivante:
class tour : public piece
{
public:
	tour(int a, int b);
	void affiche();
	bool deplacement(int x_org, int y_org, int x_fin, int y_fin, piece **u);
	int get_vie();
	int be_roi();
	int get_couleur();

private:
	int vie;
	int couleur;
};


Le paramètre vie n'est pas nécessaire, mais ce n'est pas là le problème.
Merci d'avance.
0
aramir Messages postés 939 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 26 décembre 2016 222
Modifié par aramir le 4/03/2015 à 10:00
et quelle est l'erreur au fait? Quel message reçoit tu? Erreur de compilation, d'exécution ?
0
L'erreur est a suivante:

main.cpp:48:10: error: no viable overloaded '='
u[0][0] = &tourb;
0
avec -W en option j'ai

./classe.h:9:7: note: candidate function (the implicit copy assignment operator)
not viable: no known conversion from 'tour *' to 'const piece' for 1st
argument; remove &
class piece
0
aramir Messages postés 939 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 26 décembre 2016 222
Modifié par aramir le 4/03/2015 à 11:10
Ah, bah oui. Evidemment.
Je vais essayer de faire court étant donné que j'ai pas trop le temps là tout de suite.
Mais l'opérateur '=' n'est pas un opérateur magique.

Ce que je veux dire c'est qu'il a été programmé pour fonctionner avec certaines classes, certains type.
Il a fallu que quelqu'un lui dise: "ok si tu croise quelque chose du genre a=2+1, il faut que tu fasses 2+1 et que tu affectes cette valeure à a"
L'opérateur = vient donc avec une liste standard de comportement.
Mais là tu lui demandes de travailler avec un objet 'tour' que tu as développé toi même.
Forcément il ne connait pas l'objet 'tour' , il ne sait pas quoi faire avec. C'est pas présent dans sa liste de comportement standard

Il faut donc indiquer à l'opérateur = comment manipuler les "tour".
Et pour faire celà il faut "surcharger l'opérateur ="

Je te laisse chercher un petit peu sur google comment faire ca
cherches des termes comme "operator overload" / "surcharge opérateur"
Et quand tu auras compris, regardes aussi par ici, http://www.cplusplus.com/doc/tutorial/classes2/#copy_assignment
Reviens nous voir si tu as encore des problèmes.

Bonne journée
0
Bonjour,

J'ai eu un cours sur la surcharge d'opérateur et j'ai lu le site indiqué mais j'ai pas bien compris.

Je vous explique ma vision des choses. J'ai bien compris que le compilateur de ne sait pas comment réagir car l'objet vient d'une classe que j'ai créée. Mais justement je ne comprends pas pourquoi il ne comprend pas, car je ne fait pas l'égalité entre des objets de nouveaux types mais avec une adresse et un pointeur. Pour, moi l'adresse est indépendante du type, elle indique un endroit dans la mémoire. Par conséquent je comprends pas pourquoi cela n'est pas possible.

Donc il y a deux possibilité: soit il y a des concepts mal compris, soit j'ai un tableau à deux dimensions contenant de objets de type piece et non des pointeurs de type piece. Je privilégie bien sûr la première.
0
Salut Hunken_V, je ne comprends rien aux pointeurs sur pointeurs/tableau et c'est pour ça que j'ais choisi le c++, on peut s'en passer.

#include <iostream>

class  piece
{
public:
 void affiche()
 {
  std::cout<<"vie:"<<vie<<"couleur:"<<couleur;
 }
protected:
 int vie;
 int couleur;
};

class tour : public piece
{
public:
 tour(int a, int b)
 {
  vie=a;
  couleur=b;
 }
};

int main()
{
 piece *u[8][8];
 for(int i=0;i<8;i++)
 for(int j=0;j<8;j++)
 {
  u[i][j]= new piece;
 }
 tour tourb(1,0); 
 u[0][0] = &tourb;
 
 u[0][0]->affiche();
 
 return 0;
}


tour tourb(1,0);
u[0][0] = &tourb;
passes comme une lettre à la poste, donc a mon avis ton echequier est mal initialisé, mais je ne saurais t'éclairer sur la façon d'allouer en utilisant les chaines de pointeurs.
0