[LCP] projet Zone d'initalisation

Page 1 sur 2 1, 2  Suivant

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

[LCP] projet Zone d'initalisation

Message  karemkadidola le Lun 19 Déc 2011, 12:40

Bonjour j'ai opté pour un une classe plateau qui a pour attribut "std::vector < std::vector<OthelloOutils::Etat> > othellier;"

pour le contructeur par défaut j'ai essayé plusieurs manière mais rien ne va..si quelqu'un pourrait aider car les heures tournent fatalement vite Evil or Very Mad

Code:
#include <vector>
#include <iostream>
#include "OthelloOutils.h"
#include<string>
#include <stdexcept>
#include "Plateau.h"
using namespace std;

int const RANGEES = 4, COLONNES = 4;

Plateau::Plateau() : othellier(RANGEES,vector<OthelloOutils::Etat>(COLONNES))
{

 othellier[1][1]= OthelloOutils::Etat.BLANC;
 othellier[1][2]= OthelloOutils::Etat.NOIR;
 othellier[2][1]= OthelloOutils::Etat.NOIR;
 othellier[2][2]= OthelloOutils::Etat.BLANC;
}

ensuite j'ai essayé ça
Code:

#include <vector>
#include <iostream>
#include "OthelloOutils.h"
#include<string>
#include <stdexcept>
#include "Plateau.h"
using namespace std;

int const RANGEES = 4, COLONNES = 4;


Plateau::Plateau(){
   othellier.resize(RANGEES);
   for (int i=0;i<RANGEES;i++)
      othellier[i].resize(COLONNES);
    othellier[1][1]= OthelloOutils::Etat.BLANC;
    othellier[1][2]= OthelloOutils::Etat.NOIR;
    othellier[2][1]= OthelloOutils::Etat.NOIR;
    othellier[2][2]= OthelloOutils::Etat.BLANC;


}

dans les deux cas j'ai cette erreur
..\src\Plateau.cpp:24:38: error: expected primary-expression before '.' token

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  galaeron le Lun 19 Déc 2011, 12:58

Première chose ne serait il pas préférable de faire quelque chose du style
Code:
setJoueur((x/2)-1,(y/2),OthelloOutils::NOIR);
? Pour deux raisons, la première c'est que tu définis les pions de départ de manière relative par rapport à la taille de ton "Othellier", la seconde : encapsulation?

En le faisant comme ça tu observeras que ça fonctionne cela dit.
Code:
    othellier[1][1]= OthelloOutils::BLANC;
    othellier[1][2]= OthelloOutils::NOIR;
    othellier[2][1]= OthelloOutils::NOIR;
    othellier[2][2]= OthelloOutils::BLANC;

Pourquoi ? Je me suis posé la question et je l'avais zappée, j'y travaille!

Pour ton initialisation du vecteur, voila comment je m'y suis pris :
Code:
for (unsigned int i=0;i<x;i++){
   for (unsigned int j=0;j<y;j++){
      resetPos(i,j);                  // initialisation à OthelloOutils::VIDE de toute les positions du vecteur
   }
}
PS : Pourquoi ne pas mettre directement les 4 pions de bases dans le double for ? A mon sens il est plus facile de positionner 4 pions après que de faire 4 tests à chaque itération de la boucle ...


Dernière édition par galaeron le Lun 19 Déc 2011, 13:10, édité 3 fois

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  karemkadidola le Lun 19 Déc 2011, 13:03

apparement je devrais juste faire OthelloOutils::BLANC; au lieu de OthelloOutils::Etat.NOIR; par contre la question qui reste posée est de mes deux manières de créer mon objet y en a t elle qui respecte l'utilisaton de la liste d'initialisation? je doute...mais je ne vois pas comment faire autrement..comment utiliser la boucle for dans cette liste d'initialisation et pas entre les accolades qui viennent juste après..merci d'avance..

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  karemkadidola le Lun 19 Déc 2011, 13:08

merci cher galaeron pour la diligence de la réponse ...et pour le tuyeau à appliquer quand je ne connais pas d'avance la taille de l'hotellier evidemment là c puisque je savais que ce 4x4 sinon thank u once more... Very Happy

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  karemkadidola le Lun 19 Déc 2011, 13:19

galaeron a écrit:

Pour ton initialisation du vecteur, voila comment je m'y suis pris :
Code:
for (unsigned int i=0;i<x;i++){
   for (unsigned int j=0;j<y;j++){
      resetPos(i,j);                  // initialisation à OthelloOutils::VIDE de toute les positions du vecteur
   }
}
PS : Pourquoi ne pas mettre directement les 4 pions de bases dans le double for ? A mon sens il est plus facile de positionner 4 pions après que de faire 4 tests à chaque itération de la boucle ...

ce ce que je viens de corriger à l'instant même sinon voici un exemple où on utilise une liste d'initialisation
Code:
Position(int r=-1, int c=-1):numR(r),numC(c){}
on voit bien que l'intialisation se fait avant les {} mais nous comme on utilise une boucle for pour initialiser l'objet..je me demandais s'il y a moyen de faire cette initialisation avant les {} j'ai cru comprendre que c'état VITAL pour faire un programme stable......

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  galaeron le Lun 19 Déc 2011, 13:26

Alors c'est ici que ça se passe :
http://www.cplusplus.com/reference/stl/vector/vector/

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  karemkadidola le Lun 19 Déc 2011, 13:32

Ohh t'es un chef toi... Laughing

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  galaeron le Lun 19 Déc 2011, 13:50

Pour le coup la question posée un peux plus haut de pourquoi doit on faire OthelloOutils::BLANC et pas OthelloOutils::Etat.BLANC m'intéresse aussi ...
Question à M. les professeurs, l'initialisation doit elle obligatoirement se faire dans la liste d'initialisation, ou peut elle se faire dans le constructeur ? Est-ce une bonne pratique, une question de performance?
Merci d'avance.

EDIT : Après recherche, j'ai lu que c'était les deux, meilleur performances ET bonne pratiques. Si ce n'est pas le cas, merci de me contredire!


Dernière édition par galaeron le Lun 19 Déc 2011, 14:10, édité 2 fois

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  karemkadidola le Lun 19 Déc 2011, 14:00

t'en fais pas j'avais déjà ça :
Code:

Plateau::Plateau( int const NbRangees, int const NbLignes): othellier(NbRangees,vector<OthelloOutils::Etat>(NbLignes,OthelloOutils::VIDE))
{
   
}
dans la même idée que ta façon de faire (pas encore testé) mais si ta formule est bonne je crois j'étais dans le faux (pas mis ce qu'il fallait au bon endroit) mais comme tu vois l'idée était bien là Laughing ....

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  karemkadidola le Lun 19 Déc 2011, 14:14

galaeron a écrit:
Question à M. les professeurs, l'initialisation doit elle obligatoirement se faire dans la liste d'initialisation,
Merci d'avance.

je te mets ici un petit passage trouvé sur le site du zéro mais te conseil aussi de lire la page pour saisir le contexte (la partie classes entre elles) là j'ai compris que lorsqu'un objet a pour attribut un autre objet il est crucial d'avoir une liste d'initialisation sinon "il n'y aura tout simplement pas moyen de construire l'attribut objet

Notre objet m_arme est ici initialisé avec les valeurs reçues en paramètre par Personnage (nomArme, degatsArme). C'est là que la liste d'initialisation devient utile. En effet, on n'aurait pas pu initialiser m_arme sans une liste d'initialisation !

Peut-être ne voyez-vous pas bien pourquoi. Conseil perso : ne vous prenez pas la tête à essayer de comprendre le pourquoi du comment ici, et contentez-vous de toujours utiliser les listes d'initialisation avec vos constructeurs, ça vous évitera bien des problèmes.
lien:
http://www.siteduzero.com/tutoriel-3-11177-les-classes-partie-2-2.html#ss_part_1

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  galaeron le Lun 19 Déc 2011, 14:31

je te mets ici un petit passage trouvé sur le site du zéro mais te conseil aussi de lire la page pour saisir le contexte (la partie classes entre elles) là j'ai compris que lorsqu'un objet a pour attribut un autre objet il est crucial d'avoir une liste d'initialisation sinon "il n'y aura tout simplement pas moyen de construire l'attribut objet

Je ne crois pas que ce que tu dises sois juste, car cela fonctionnait parfaitement chez moi sans liste d'initialisation, cependant que cela nécessite des précautions.
En effet lors de la construction d'un objet temporaire son "affectation" via un simple "=" est un peux douteux ... voila pourquoi, j'utilise beaucoup de références qui ont aussi l'avantage (je pense) d'augmenter les performances du à leur plus faible consommation en RAM qu'un objet (aka taille d'une adresse).

NB : Après recherche la liste d’initialisation semble plus performante dans ce cas ci. Cela dit, je reste convaincus du bien fondé de mon raisonnement sur les références dans la majeur partie des autres cas.
NB2 : Ce n'est pas pour rien qu'il est parfois nécessaire de redéfinir l’opérateur "="


Dernière édition par galaeron le Lun 19 Déc 2011, 14:37, édité 1 fois

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  karemkadidola le Lun 19 Déc 2011, 14:37

Autant pour moi si tu as essayé et que ça a marché !!!! c'est même un bonne nouvelle pour moi..

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  nvs le Lun 19 Déc 2011, 16:31

galaeron a écrit:Pour le coup la question posée un peux plus haut de pourquoi doit on faire OthelloOutils::BLANC et pas OthelloOutils::Etat.BLANC m'intéresse aussi ...
le point ('.') sert à accéder à un attribut ou une méthode d'une classe ou d'une structure. OthelloOutils::Etat n'est ni l'une ni l'autre, mais est une énumération.

galaeron a écrit:Question à M. les professeurs, l'initialisation doit elle obligatoirement se faire dans la liste d'initialisation, ou peut elle se faire dans le constructeur ? Est-ce une bonne pratique, une question de performance?
initialiser au maximum dans la liste d'initialisation est un bon plan. dans le cas présent, on peut construire un othelier vide dans la liste d'initialisation et poser les 4 pions initiaux dans le corps du constructeur.





Basketball

_________________

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: [LCP] projet Zone d'initalisation

Message  karemkadidola le Lun 19 Déc 2011, 17:18

Merci pour les explications c'est du coup plus clair..une toute dernière question..pour l'instant... (dans mon cas) comme dans ma classe Plateau il n'y a pas de pointeur comme attribut (juste un seul attribut othellier qui est un vecteur des vecteurs des Etats) est il nécessaire d'avoir un constructeur de copie redéfinie et surcharger l'opérateur = (ces deux là allant de pair) là c'était la première question et enfin est il nécessaire d'avoir un destructeur étant donné que je ne fais aucune allocation dynamique dans ma classe....ma petite idée est Non à toutes ces questions, je pense je peux me contenter du constructeur de copie par défaut et du reste sans danger mais après j'aurais aimé avoir confirmation de quelqu'un qui en soit sûr à 100 pour cent...

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  nvs le Lun 19 Déc 2011, 19:45

les réponses sont en effet très probablement non.







Surprised

_________________

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: [LCP] projet Zone d'initalisation

Message  neciO le Lun 19 Déc 2011, 20:13

J'ai aussi une petit question au sujet des initialisations, pourquoi lorsque j'écris ça :

Code:
Othellier::Othellier(int nbLignes, int nbColonnes): othellier(nbLignes, vector<OthelloOutils::Etat>(nbColonnes, OthelloOutils::VIDE)) {}
Je n'ai aucun soucis.

Mais lorsque j'écris :
Code:
Othellier::Othellier(int nbLignes, int nbColonnes) {
othellier(nbLignes, vector<OthelloOutils::Etat>(nbColonnes, OthelloOutils::VIDE));
}

ça pose problème ?

neciO

Nombre de messages : 28
Age : 28
Prénom : Juan Carlos
Statut : Etudiant 2e Réseaux
Date d'inscription : 19/10/2010

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  M. Pixel le Lun 19 Déc 2011, 20:47

neciO a écrit:J'ai aussi une petit question au sujet des initialisations, pourquoi lorsque j'écris ça :

Code:
Othellier::Othellier(int nbLignes, int nbColonnes): othellier(nbLignes, vector<OthelloOutils::Etat>(nbColonnes, OthelloOutils::VIDE)) {}
Je n'ai aucun soucis.

Mais lorsque j'écris :
Code:
Othellier::Othellier(int nbLignes, int nbColonnes) {
othellier(nbLignes, vector<OthelloOutils::Etat>(nbColonnes, OthelloOutils::VIDE));
}

ça pose problème ?

Le deuxième cas ne peut pas compiler tout simplement parce-que tu fais une deuxième fois appel au constructeur. En effet, quand tu déclares un objet dans une classe, lors de la création de la classe, l'objet membre est automatiquement initialisé.
On peut outre-passer cette auto-initialisation, et c'est en employant la syntaxe que tu as utilisé dans ton premier code. Dans le deuxième code, l'auto-initialisation est déjà faite, et donc un nouvel appel au constructeur sera refusé.

Si tu veux choisir explicitement où et quand tu initialises un objet, je ne vois comme seule solution un pointeur. Tu peux alors l'initialiser avec new quand tu veux (mais n'oublie pas de libérer cette mémoire!).

Sans pointeurs, compile:
Code:
class A
{
public:
    A(void);
private:
    vector<int> tab;
};

A::A(void) : tab(5) {}

Sans pointeurs, ne compile pas:
Code:
class A
{
public:
    A(void);
private:
    vector<int> tab;
};

A::A(void)
{
    tab(5);
}

Avec un pointeur, compile:
Code:
class A
{
public:
    A(void);
    virtual ~A();
private:
    vector<int> * tab;
};

A::A(void)
{
    tab = new vector<int>(5);
}

A::~A()
{
    delete tab;
}

M. Pixel

Nombre de messages : 19
Prénom : Etienne
Localisation : 0x7C00
Date d'inscription : 15/12/2010

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  neciO le Lun 19 Déc 2011, 21:21

Merci beaucoup M. Pixel Smile

neciO

Nombre de messages : 28
Age : 28
Prénom : Juan Carlos
Statut : Etudiant 2e Réseaux
Date d'inscription : 19/10/2010

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  karemkadidola le Lun 19 Déc 2011, 21:57

nvs a écrit:les réponses sont en effet très probablement non.
Surprised

Merci beaucoup pour cette précision Mr

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  nvs le Lun 19 Déc 2011, 22:04

M. Pixel a écrit:
neciO a écrit:J'ai aussi une petit question au sujet des initialisations, pourquoi lorsque j'écris ça :

Code:
Othellier::Othellier(int nbLignes, int nbColonnes): othellier(nbLignes, vector<OthelloOutils::Etat>(nbColonnes, OthelloOutils::VIDE)) {}
Je n'ai aucun soucis.

Mais lorsque j'écris :
Code:
Othellier::Othellier(int nbLignes, int nbColonnes) {
othellier(nbLignes, vector<OthelloOutils::Etat>(nbColonnes, OthelloOutils::VIDE));
}

ça pose problème ?

Le deuxième cas ne peut pas compiler tout simplement parce-que tu fais une deuxième fois appel au constructeur. En effet, quand tu déclares un objet dans une classe, lors de la création de la classe, l'objet membre est automatiquement initialisé.
On peut outre-passer cette auto-initialisation, et c'est en employant la syntaxe que tu as utilisé dans ton premier code. Dans le deuxième code, l'auto-initialisation est déjà faite, et donc un nouvel appel au constructeur sera refusé.

Si tu veux choisir explicitement où et quand tu initialises un objet, je ne vois comme seule solution un pointeur. Tu peux alors l'initialiser avec new quand tu veux (mais n'oublie pas de libérer cette mémoire!).

Sans pointeurs, compile:
Code:
class A
{
public:
    A(void);
private:
    vector<int> tab;
};

A::A(void) : tab(5) {}

Sans pointeurs, ne compile pas:
Code:
class A
{
public:
    A(void);
private:
    vector<int> tab;
};

A::A(void)
{
    tab(5);
}

Avec un pointeur, compile:
Code:
class A
{
public:
    A(void);
    virtual ~A();
private:
    vector<int> * tab;
};

A::A(void)
{
    tab = new vector<int>(5);
}

A::~A()
{
    delete tab;
}
tu es un peu excessif, M. Pixel.

Sans pointeur, compile :
Code:
class A
{
public:
    A(void);
private:
    vector<int> tab;
};

A::A(void)
{
    tab = vector<int>(5);
}

c'est assez laid comparé à la liste d'initialisation, mais ça marche.

Avec un pointeur, compile:
Code:
class A
{
public:
    A(void);
    virtual ~A();
private:
    vector<int> * tab;
};

A::A(void) : tab(new vector<int>(5))
{ }

A::~A()
{
    delete tab;
}









bounce

_________________

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: [LCP] projet Zone d'initalisation

Message  neciO le Mar 20 Déc 2011, 14:39

Bonjour,

j'ai donc réussi a utilisé la méthode avec pointeur en mettant ceci dans mon constructeur :
Code:
this->othellier = new vector<vector<OthelloOutils::Etat > > (nbRangees, vector<OthelloOutils::Etat>(nbColonnes, OthelloOutils::VIDE));

et ceci dans ma class :
Code:
 vector<vector<OthelloOutils::Etat> > * othellier

mais je ne n'arrive pas à déterminer comment faire pour accédé aux case non pas par :
Code:
this->getOthellier()->at(rangee).at(colonne);

mais plutôt par :
Code:
this->getOthellier()->at(rangee)->at(colonne);

Merci pour votre aide Smile

neciO

Nombre de messages : 28
Age : 28
Prénom : Juan Carlos
Statut : Etudiant 2e Réseaux
Date d'inscription : 19/10/2010

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  bigmax le Mar 20 Déc 2011, 14:44

pourquoi ne pas y accéder simplement avec this->getOthellier()[rangee][colonne] ?

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: [LCP] projet Zone d'initalisation

Message  nvs le Mar 20 Déc 2011, 15:13

quelle mauvaise idée cet attribut dynamique...









Neutral

_________________

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: [LCP] projet Zone d'initalisation

Message  neciO le Mar 20 Déc 2011, 15:54

bigmax a écrit:pourquoi ne pas y accéder simplement avec this->getOthellier()[rangee][colonne] ?

Je n'arrive simplement pas a retournée la valeur avec cette méthode, j'ai une erreur. Je dois faire quelque chose mal quelque part :p mais je vois pas.

nvs a écrit:quelle mauvaise idée cet attribut dynamique...
Neutral

En fait j'ai fait ça afin de contrôler que le nombre de colonnes et de rangées sont bien compris entre 4 et 12, mais si vous avez un autre conseil, je suis vraiment preneur Smile

neciO

Nombre de messages : 28
Age : 28
Prénom : Juan Carlos
Statut : Etudiant 2e Réseaux
Date d'inscription : 19/10/2010

Revenir en haut Aller en bas

Re: [LCP] projet Zone d'initalisation

Message  bigmax le Mar 20 Déc 2011, 17:05

Pour faire fonctionner ta classe Plateau tu as juste besoin de ça ( + les méthodes qui vont bien évidement..)
Code:

/*Plateau.h*/
private:
   int nbLigne;
   int nbColonne;
   vector<vector<OthelloOutils::Etat> >othello;
Code:

/*Constructeur Plateau*/
Plateau::Plateau(int ligne,int colonne):nbLigne(ligne),nbColonne(colonne),
      othello(vector<vector<OthelloOutils::Etat> >(nbLigne, vector<OthelloOutils::Etat>(nbColonne))){
   for(int i=0;i<nbLigne;i++){
      for(int j=0;j<nbColonne;j++){
         othello[i][j] = OthelloOutils::VIDE;
      }
   }
   // Après faut ajouter les pions de départ
}

En fait j'ai fait ça afin de contrôler que le nombre de colonnes et de rangées sont bien compris entre 4 et 12, mais si vous avez un autre conseil, je suis vraiment preneur Smile

Soit ton constructeur lance une exception
Soit tu t'arranges pour créer ton Plateau une fois que tu es sur d'avoir obtenu un nombre ligne et colonne valide..

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: [LCP] projet Zone d'initalisation

Message  Contenu sponsorisé Aujourd'hui à 20:43


Contenu sponsorisé


Revenir en haut Aller en bas

Page 1 sur 2 1, 2  Suivant

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