[C++]Projet1 Problème placementDe

Voir le sujet précédent Voir le sujet suivant Aller en bas

[C++]Projet1 Problème placementDe

Message  bigmax le Lun 20 Déc 2010, 13:44

Bonjour tout le monde, j'ai un souci dans mon projet avec ma classe placementDe :

Code:
class PlacementDe  {
private:
   Position posArrivee;
   De de;

public:
   PlacementDe();
   PlacementDe(Position arrivee,De unDe);
   PlacementDe(PlacementDe & placement);
   virtual ~PlacementDe();
   Position getArrivee();
   De getDe();
   void jouer(EtatJeu etat);
   bool estValide(EtatJeu etat);

Hors dans mon main, si je veux tester que mon coup fonctionne, placement.jouer(etat) ne modifie pas le tablier mais je ne sais pas pourquoi..?


Code:
int main() {
   EtatJeu etat;
   Position pos(1,4);
   De de(3);
   PlacementDe placement (pos,de);
   placement.jouer(etat);
   etat.getTablier().afficherTab();
   system("pause");
   return 0;
}


Code:
void PlacementDe::jouer(EtatJeu etat){
   if(estValide(etat)){
      etat.getTablier().placerDe(posArrivee,de);
      etat.changeJoueurCourant();
   }
}

Code:
class EtatJeu {
private :
   Tablier tablier;  // vector<vector<De> >
   Joueurs joueurCourant;
   Joueurs joueurGagnant;

Alors si quelqu'un sait m'aider ça illuminerait ma journée ! Merci d'avance.

bigmax

Nombre de messages : 132
Age : 27
Prénom : Gilles
Statut : 3ème Réseaux
Date d'inscription : 17/11/2007

Revenir en haut Aller en bas

Re: [C++]Projet1 Problème placementDe

Message  Dj x-fuse le Lun 20 Déc 2010, 13:51

Il me semblerait (corrigez-moi si je me trompe), mais en C, ce que tu reçois en paramètre est une copie de ton objet. Du coup, si tu souhaites modifier cette copie, l'original n'en sera pas modifier.
Pour modifier l'original, passe par un pointeur d'EtatJeu. Wink

Dj x-fuse

Nombre de messages : 658
Age : 27
Prénom : Jonathan
Statut : 4ième sécu
Localisation : IRL
Date d'inscription : 18/10/2008

Revenir en haut Aller en bas

Re: [C++]Projet1 Problème placementDe

Message  bigmax le Lun 20 Déc 2010, 15:52

Bon en suivant la piste de Dj j'ai réussi à résoudre le problème mais sans trop vraiment comprendre
alors si un prof passe par là je suis preneur d'une explication..

voila la modification effectuée :

Code:
class EtatJeu {
private :
   Tablier *tablier;
   vector<Joueur> joueurs;
   Joueur joueurCourant;
   Joueur joueurGagnant;
public:
   EtatJeu();
   EtatJeu(EtatJeu & etat);
          ...
   Tablier & getTablier(); // ici je n'ai pas vraiment compris pourquoi retourner une référence de mon tablier..

Code:
Tablier & EtatJeu::getTablier(){
   return *this->tablier;
}

Bon ça a surement été expliqué au cours les notions référence-pointeurs mais j'ai manqué 2 séances de cours à cause d'un ennui de santé..

bigmax

Nombre de messages : 132
Age : 27
Prénom : Gilles
Statut : 3ème Réseaux
Date d'inscription : 17/11/2007

Revenir en haut Aller en bas

Re: [C++]Projet1 Problème placementDe

Message  nvs le Lun 20 Déc 2010, 17:13

[HS]
je dois avouer ne rien comprendre à ton analyse qui me semble d'une complexité effroyable au vu de la simplicité du problème. une méthode de la classe EtatJeu qui retourne un Tablier, une classe PlacementDe avec une méthode qui possède un EtatJeu en argument... je m'y perds... en fait non, je ne m'y engage pas.

juste pour info, ma solution est constituée des classes Cephalopod, De et Position et des énumérations Couleur, Taille et Direction -- en fait, il y a aussi des classes d'exception et des classes du modèle de conception Observateur / Sujet d'observation, mais il s'agit de notions qui vous seront servies au second semestre. 3 classes et 3 énumérations aux noms clairs. ça me semble propre et net Smile

ceci dit, tu fais probablement bien de fouiller l'analyse histoire de rendre le code facilement réutilisable etc. mais peut-être agis-tu ainsi au détriment de l'apprentissage du langage sous-jacent. pourquoi ne pas attendre de maîtriser un peu c++ pour se lancer dans de grosses architectures logicielles ?
[/HS]

bigmax a écrit:
Code:
class EtatJeu {
private :
  Tablier *tablier;
  ...
};
Code:
Tablier & EtatJeu::getTablier(){
   return *this->tablier;
}
alors là, je dis halte là ! tu violes une des directives que je donne à mes étudiants, et, pour ce que j'en sais, mes collègues y adhèrent. à savoir :
LCP : CPP01 : CEPHALOPOD (nvs) ESI – Année 2010 - 2011 a écrit:Lors de la lecture de vos sources, je serai particulièrement attentif :
  • [...] ;
  • à l'absence de méthode retournant la valeur d'un pointeur attribut d'instance (ce qui, en c++,
    revient à révéler trop de détails de l'implémentation et peut mener à la destruction d'un objet
    de l'intérieur).
retourne un Tablier et non une référence de Tablier si tu veux éviter le courroux de ton prof Shocked

vois ton prof -- il est un peu tard maintenant -- pour plus de détails ou, à défaut de mieux, va voir ici, à la section 2.9.












_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [C++]Projet1 Problème placementDe

Message  didi le Lun 20 Déc 2010, 20:24

LCP : CPP01 : CEPHALOPOD (nvs) ESI – Année 2010 - 2011 a écrit:Lors de la lecture de vos sources, je serai particulièrement attentif :

* [...] ;
* à l'absence de méthode retournant la valeur d'un pointeur attribut d'instance (ce qui, en c++,
revient à révéler trop de détails de l'implémentation et peut mener à la destruction d'un objet
de l'intérieur).
je vous merci de m'expliquer ( vraiment je ne comprends pas ce vous attendez par là ... Sad )
SVP ... Smile

didi

Nombre de messages : 215
Prénom : Dinesh
Statut : Smile
Date d'inscription : 21/01/2009

Revenir en haut Aller en bas

Re: [C++]Projet1 Problème placementDe

Message  nvs le Lun 20 Déc 2010, 20:36

didi a écrit:
LCP : CPP01 : CEPHALOPOD (nvs) ESI – Année 2010 - 2011 a écrit:Lors de la lecture de vos sources, je serai particulièrement attentif :

* [...] ;
* à l'absence de méthode retournant la valeur d'un pointeur attribut d'instance (ce qui, en c++,
revient à révéler trop de détails de l'implémentation et peut mener à la destruction d'un objet
de l'intérieur).
je vous merci de m'expliquer ( vraiment je ne comprends pas ce vous attendez par là ... Sad )
SVP ... Smile
nvs a écrit:pour plus de détails [...] va voir ici, à la section 2.9.










_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [C++]Projet1 Problème placementDe

Message  bigmax le Lun 20 Déc 2010, 21:12

Oui effectivement je me base sans doute trop sur le projet java de l'année dernière pour réaliser Céphalopode..
Par contre si je retourne un Tablier, dans mon main le tablier n'est jamais modifier..
Je vais lire avec attention le pdf à la recherche d'une solution.

Merci M. Vansteenkiste, c'est chouette d'avoir des profs qui prennent le temps de nous répondre.

bigmax

Nombre de messages : 132
Age : 27
Prénom : Gilles
Statut : 3ème Réseaux
Date d'inscription : 17/11/2007

Revenir en haut Aller en bas

Re: [C++]Projet1 Problème placementDe

Message  nvs le Lun 20 Déc 2010, 21:26

bigmax a écrit:Oui effectivement je me base sans doute trop sur le projet java de l'année dernière pour réaliser Céphalopode..
Par contre si je retourne un Tablier, dans mon main le tablier n'est jamais modifier..
Je vais lire avec attention le pdf à la recherche d'une solution.
java et c++ sont très différents pour ce qui concerne la manière d'atteindre la mémoire. référence d'office pour les objets en java ; choix entre objet, pointeur ou référence, opérateur d'adresse et opérateur delete en c++.

la solution en c++ est donnée dans les codes de la section 2.9 du pdf renseigné : la classe qui possède un attribut de type pointeur d'une autre classe retourne un clone de cet objet et fourni des services elle-même pour modifier les attributs de son attribut pointeur -- en utilisant les services de la classe de celui-ci. note que si l'attribut est un objet (pas de pointeur avec un objet dynamique), la classe pourrait retourner une référence vers cet objet sans que delete ne permette de le tuer de l'intérieur Smile








_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [C++]Projet1 Problème placementDe

Message  bigmax le Mar 21 Déc 2010, 21:37

Bon en créant un objet Tablier de manière dynamique, je n'arrive toujours pas à modifier le tablier du main..

J'ai changé pour un objet Tablier statique ( je ne sais pas si c'est comme ça qu'on doit l'appeler) et la ça semble fonctionner..

Code:
Tablier::Tablier() {
   this->nbLigne = 5;
   this->nbColonne = 5;
   this->tablier = vector<vector<De> > (nbLigne, vector<De> (nbColonne));
   for (int i = 0; i < nbLigne; i++) {
      for (int j = 0; j < nbColonne; j++) {
         tablier[i][j] = De();
      }
   }


}

Code:
class EtatJeu {
private :
   Tablier tablier ;
        ...

Code:
public:
   EtatJeu();
        ...
   Tablier &getTablier();
Code:

Tablier &EtatJeu::getTablier(){
   return tablier;
}


bigmax

Nombre de messages : 132
Age : 27
Prénom : Gilles
Statut : 3ème Réseaux
Date d'inscription : 17/11/2007

Revenir en haut Aller en bas

Re: [C++]Projet1 Problème placementDe

Message  nvs le Mar 21 Déc 2010, 22:31

utilise plutôt la liste d'initialisation lors de la construction :
Code:
Tablier::Tablier() :
    nbLigne(5),
    nbColonne(5),
    tablier(vector<vector<De> >(nbLigne, vector<De>(nbColonne, De())))
{ }
ainsi que deux fois le même constructeur de vector histoire de rendre inutiles les deux boucles for imbriquées.

[edt] : le second argument du second constructeur de vector est inutile car on a remplissage du vector avec l'objet obtenu par le constructeur par défaut (voir le second constructeur ici). les choses sont donc encore plus simples :
Code:
Tablier::Tablier() :
    nbLigne(5),
    nbColonne(5),
    tablier(vector<vector<De> >(nbLigne, vector<De>(nbColonne)))
{ }
et donc dans ton code la double boucle for est inutile.

[edt bis] : le vector de vector temporaire de De est totalement inutile dans ma construction. le mieux (jusqu'à l'[edt ter]) est donc :
Code:
Tablier::Tablier() :
    nbLigne(5),
    nbColonne(5),
    tablier(nbLigne, vector<De>(nbColonne))
{ }









_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [C++]Projet1 Problème placementDe

Message  Contenu sponsorisé Aujourd'hui à 12:35


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum