[C++][Classes] [Résolu]

Signaler
Messages postés
42
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
9 décembre 2008
-
Messages postés
42
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
9 décembre 2008
-
  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

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
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.
Messages postés
1
Date d'inscription
dimanche 7 mai 2006
Statut
Membre
Dernière intervention
25 novembre 2006

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
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Il te suffit d'ajouter un accesseur/mutateur a ta classe bateau

void CEnsemble : : AjouterBateau(CBateau & UnBateau)
{
   mGrille[  UnBateau.getLigne() ] [ UnBateau.getColonne() ] = 1;
}
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
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");
}
Messages postés
42
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
9 décembre 2008
1
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.
Messages postés
42
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
9 décembre 2008
1
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.
Messages postés
42
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
9 décembre 2008
1
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...
   
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
il faut rajouter public: au debut de la classe
Messages postés
42
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
9 décembre 2008
1
Réponse rapide merci! Mais j'ai deja mis les "unsigned" derriere un public: je ne vois pas ce qui cloche...
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Majuscule sur Get
Messages postés
42
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
9 décembre 2008
1
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.