[C++][Classes]

Résolu
psychospire Messages postés 42 Date d'inscription mercredi 8 novembre 2006 Statut Membre Dernière intervention 9 décembre 2008 - 25 nov. 2006 à 17:16
psychospire Messages postés 42 Date d'inscription mercredi 8 novembre 2006 Statut Membre Dernière intervention 9 décembre 2008 - 26 nov. 2006 à 02:30
  Bonjour à tous, j'ai un léger problème pour mon projet d'informatique (bataille navale) que je n'arrive pas à résoudre. J'ai créé une classe "CBateau" dans laquelle je rentre les coordonnées de mes bateaux (coordonnées fonctions de la place du bateau sur la grille 10x10 (un élément pour le numéro de la ligne et un pour le numéro de la colonne)) dans des tableaux (Un tableau par bateau). 
  J'ai également une classe "CEnsemble" représentant la grille de la bataille navale (matrice 10x10). Le problème, c'est que j'aimerai à présent poser mes bateaux sur la grille (représentés par des 1 sur une grille de 0), et donc créer une méthode dans CEnsemble qui contiendrait des éléments de la classe "CBateaux".
  En gros, j'aimerais faire quelquechose de la sorte pour enregistrer la coordonnée d'une case du bateau sur la grille :

void CEnsemble : : AjouterBateau(CBateau & UnBateau)
{
mGrille[  UnBateau[0] ] [ UnBateau[1] ] = 1;
}
(UnBateau[0]  et  UnBateau[1] forment la position d'une case du bateau sur la grille)

mais le logiciel me dit que je ne peut pas attribuer de [ ] à UnBateau, qui est pourtant un tableau...

  Voila je sais que c'est un peu brouillon, mais si quelqu'un à compris à peu pres de quoi je voulais parler et aurais une solution à me proposer je suis preneur. Merci.

11 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
25 nov. 2006 à 23:46
A oui, tu veux dire qu'1 bateau est composé d'un tab de ligne et d'un tab de colonne formant une matrice.

#define LIGNE 0
#define COLONNE 1

class CBateau
{
   const int tailleBateau = 3;      // ex : bateau de 3 cases
   unsigned char m_coords[3][2];   // les coords ligne et colonnes

   // defini coords
   CBateau()
   {
      m_coords[0][LIGNE] = 2; m_coords[0][COLONNE] = 3;
      m_coords[1][LIGNE] = 3; m_coords[1][COLONNE] = 3;
      m_coords[2][LIGNE] = 4; m_coords[2][COLONNE] = 3;
   }

   unsigned char GetCoordLigne(int partieBateau)
   {
      return m_coords[partieBateau][LIGNE];
   }
   unsigned char GetCoordColonne(int partieBateau)
   {
      return m_coords[partieBateau][COLONNE];
   }
};

// placer un bateau

CEnsemble unEnsemble;
CBateau monBateau;
unEnsemble.AjouterBateau(monBateau);

void CEnsemble : : AjouterBateau(CBateau & UnBateau)
{
   for(int i=0; i<CBateau::tailleBateau; i++)
   {
   mGrille[UnBateau.getCoordLigne(i)][UnBateau.getCoordColonne(i)] = 1; 
   }
}

// bien sur la taille bateau n'est pas constante et il y a plus efficace.
3
KICcodeur Messages postés 1 Date d'inscription dimanche 7 mai 2006 Statut Membre Dernière intervention 25 novembre 2006
25 nov. 2006 à 17:38
Salut,
il est important de bien comprendre ce qu'est un tableau. Quand UnBateau représente pour toi un tableau c'est en réalité un pointeur. Je m'explique: UnBateau[0] correspond a un élément du tableau tandis que UnBateau correspond a l'adresse qu premier élément. Je te conseil donc d'essayer : AjouterBateau(CBateau * UnBateau). Si je ne m'abuse sa devrait tourner comme sa ;-)
FRA
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
25 nov. 2006 à 19:11
Il te suffit d'ajouter un accesseur/mutateur a ta classe bateau

void CEnsemble : : AjouterBateau(CBateau & UnBateau)
{
   mGrille[  UnBateau.getLigne() ] [ UnBateau.getColonne() ] = 1;
}
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
25 nov. 2006 à 19:24
Ou de surcharger l'operator []

const CBateau::CBateau& operator [] (int indice) const
{
   if(indice == 0) return m_ligne;
   if(indice == 1) return m_colonne;
   throw new IndiceException("indice hors de portée");
}
0

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

Posez votre question
psychospire Messages postés 42 Date d'inscription mercredi 8 novembre 2006 Statut Membre Dernière intervention 9 décembre 2008 1
25 nov. 2006 à 23:04
Salut, merci pour vos réponses.


KICcodeur, j'ai essayé en mettant * com tu le dit mais ca ne fonctionne pas, il me marque toujours : "error C2676: binary '[' : 'class CBateau' does not define this operator or a conversion to a type acceptable to the predefined operator".

Yann, pourrais tu me dire ce que UnBateau.getLigne() doit renvoyer exactement? De plus, je ne l'ai pas précisé dans mon premier post pour une question de clarté mais j'ai défini le tableau de mon bateau comme une matrice [N][2], c'est-à-dire que je doit entrer un numéro de ligne et un numéro de colonne pour afficher un élément du tableau. Ce que je veux se rapproche plus de ca :
mGrille[  UnBateau[0][0] ] [ UnBateau[0][1] ] = 1; 
 Est-ce la meme méthode que celle que tu as décrite?

Enfin, je ne comprend pas tres bien ce que tu veux dire par "surcharger l'opérateur" ni ce que c'est censé faire .
 Pourrais-tu préciser ta pensée? Merci d'avance.
0
psychospire Messages postés 42 Date d'inscription mercredi 8 novembre 2006 Statut Membre Dernière intervention 9 décembre 2008 1
26 nov. 2006 à 01:55
Ok je commence à comprendre ton idée, ca m'a l'air impec, à part que je ne connais pas du tout la syntaxe "unsigned", quel est sa fonction exactement??
Merci pour ta réponse en tout cas, ca va surement m'etre tres utile.
0
psychospire Messages postés 42 Date d'inscription mercredi 8 novembre 2006 Statut Membre Dernière intervention 9 décembre 2008 1
26 nov. 2006 à 02:06
Problème à la ligne :
mGrille[UnBateau.getCoordLigne(i)][UnBateau.getCoordColonne(i)] = 1; 
Il me dit que getCoordLigne et getCoordColonne ne sont pas des membres de CBateau...
   
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 02:09
il faut rajouter public: au debut de la classe
0
psychospire Messages postés 42 Date d'inscription mercredi 8 novembre 2006 Statut Membre Dernière intervention 9 décembre 2008 1
26 nov. 2006 à 02:13
Réponse rapide merci! Mais j'ai deja mis les "unsigned" derriere un public: je ne vois pas ce qui cloche...
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 02:18
Majuscule sur Get
0
psychospire Messages postés 42 Date d'inscription mercredi 8 novembre 2006 Statut Membre Dernière intervention 9 décembre 2008 1
26 nov. 2006 à 02:30
Ah ouais en effet lol ca marche beaucoup mieux comme ca. Merci beaucoup pour ton aide, je vais enfin pouvoir continuer mon projet ouf! Bonne soirée à toi et merci encore.
0
Rejoignez-nous