Aller au contenu


Photo

Mini-Projet de C++

C++ CPP

  • Veuillez vous connecter pour répondre
52 réponses à ce sujet

#21 Paul VENET

Paul VENET

    Member

  • Étudiant
  • PipPip
  • 23 messages
  • LocationMontpellier

Posté 17 février 2015 - 05:40

 

Reporter une erreur serait mieux plutôt que de magiquement changer l'entrée.

Dans le sujet il est dis que l'on devait prendre la valeur absolut et ajouter un si le chiffre était paire donc on peut directement modifier l'entrée client.

 

 

Si tu veux vérifier que l'utilisateur renseigne bien des entiers, et non pas des caractères, il va falloir le faire directement dans la fonction « saisir », vu que ça implique de vérifier directement l'état de std::cin.

Pour être sur de ne pas faire un hors sujet ou perdre des points, je met les entrée dans une string que je concatene avec un delimiter bien particulier. Je retourne le tous a la fonction choisirCase puis je la parse et la convertie en int avec stoi et je le revoie dans la fonction incorect.



#22 Mathieu STEFANI

Mathieu STEFANI

    Member

  • Étudiant
  • PipPip
  • 67 messages
  • Cursus:A.Sc.1

Posté 17 février 2015 - 05:45

Je vois pas en quoi faire de la validation comme je l'ai décrit serait du hors sujet. Si ton formateur te pénalise parce que tu t'es permis, à juste titre, de prendre quelques libertés par rapport au sujet, il mériterait la sanction disciplinaire sur le champ.



#23 Paul VENET

Paul VENET

    Member

  • Étudiant
  • PipPip
  • 23 messages
  • LocationMontpellier

Posté 17 février 2015 - 05:49

Tu as surement raison. Mais je garde ma manière mais merci quand même.



#24 Paul VENET

Paul VENET

    Member

  • Étudiant
  • PipPip
  • 23 messages
  • LocationMontpellier

Posté 17 février 2015 - 07:04

J'ai encore une question (et je crois pas que c'est la dernière en plus):

Pour la classe ange, son constructeur, pour initialiser la ligne et la colonne on doit bien prendre la dimension du plateau donc dim et la diviser par deux pour le placer?

Sauf que quand je fais ça ce cette manière :

Ange::Ange()
{
    ligne = Plateau.dim/2;
    colonne = Plateau.dim/2;
}

erreur:  expected primary-expression before '.' token

Ou

Ange::Ange()
{
    ligne = Plateau->dim/2;
    colonne = Plateau->dim/2;
}

Erreur: expected primary-expression before '->' token

ou encore en passant par un fonction get

Ange::Ange()
{
    ligne = Plateau.getDim()/2;
    colonne = Plateau.getDim()/2;
}

j'ai une erreur: expected primary-expression before '.' token|

 

Vous avez une idée ?



#25 Mathieu STEFANI

Mathieu STEFANI

    Member

  • Étudiant
  • PipPip
  • 67 messages
  • Cursus:A.Sc.1

Posté 17 février 2015 - 07:08

Ou est-ce que tu initialises Plateau ? Je suis pratiquement sûr que tu vas devoir le passer en paramètre du constructeur:

Ange::Ange(const Plateau& plateau)
  : ligne(plateau.getDim() / 2)
  , colonne(plateau.getDim() / 2)
{
}

Voire faire une méthode statique:

Ange Ange::positionSurPlateau(const Plateau& plateau) {
    Ange ange(plateau.getDim() / 2, plateau.getDim() / 2);

    return ange;
}


#26 Paul VENET

Paul VENET

    Member

  • Étudiant
  • PipPip
  • 23 messages
  • LocationMontpellier

Posté 17 février 2015 - 07:13

Tu as raison il faut l'initialiser je m'en suis rendu compte quand j'ai tester ceci:

Ange::Ange()
{
    Plateau plateau = Plateau();
    ligne = plateau.getDim()/2;
    colonne = plateau.getDim()/2;
    cout<<ligne<<colonne<<endl;
}

si je le passe en paramètre au constructeur il sera initialisé pour toute les méthodes d'ange ?

 

enfaite si j'utilise la méthode en le passant en paramètre ça met une erreur : passing 'const Plateau' as 'this' argument of 'int Plateau::getDim()' discards qualifiers [-fpermissive].


Modifié par Paul VENET, 17 février 2015 - 07:18 .


#27 Mathieu STEFANI

Mathieu STEFANI

    Member

  • Étudiant
  • PipPip
  • 67 messages
  • Cursus:A.Sc.1

Posté 17 février 2015 - 07:57

 

 

si je le passe en paramètre au constructeur il sera initialisé pour toute les méthodes d'ange

 

Non, tu y auras accés uniquement s'il fait parti de ta classe en tant que variable membre et que tu l'initialises correctement.

 

 

 

passing 'const Plateau' as 'this' argument of 'int Plateau::getDim()' discards qualifiers [-fpermissive].

 

const-correctness: getDim() devrait être déclarée const.



#28 Mathieu IZQUIERDO

Mathieu IZQUIERDO

    Member

  • Étudiant
  • PipPip
  • 13 messages
  • LocationTOULOUSE
  • Cursus:M.Sc.2

Posté 17 février 2015 - 08:08

Salut,

 

Relit bien le sujet la il me semble que tu t'égare... ton objet de la classe Plateau est instancié dans la classe Partie et pas Ange.

 

Donc soit tu passe au constructeur de la classe Ange les valeurs de ligne et colonne, soit tu lui passe l'objet et tu appelle une méthode qui te retourne dim, ou encore par référence tu passe a une méthode de la classe Partie les variables ligne et colonne …. ou un pointeur ? Il y a plein de solutions ^^



#29 Paul VENET

Paul VENET

    Member

  • Étudiant
  • PipPip
  • 23 messages
  • LocationMontpellier

Posté 19 février 2015 - 11:13

Bonjour.

Je suis d'accord avec toi mais dans la façon ou est tournée le sujet si on dev étape par étape en suivant l'ordre ou est écris le sujet c'est assez compliqué de si retrouver.



#30 Laurent GODEFROY

Laurent GODEFROY

    Member

  • Full Professors
  • 270 messages
  • LocationTours (37)

Posté 19 février 2015 - 11:43

Bonjour Paul,

C'est sans doute pour cela qu'il est recommandé dans le sujet de le lire en intégralité avant de commencer à coder.



#31 Paul VENET

Paul VENET

    Member

  • Étudiant
  • PipPip
  • 23 messages
  • LocationMontpellier

Posté 19 février 2015 - 12:02

Bonjour, j'ai de nouveau une question.

Dans la classe partie on déclare un tableau de deux joueurs.

Quand j'instancie une partie je fais ceci:

Partie::Partie(int l, string j1, string j2 )
{
    Plateau plateau = Plateau(l);
    Joueur *joueur = new Joueur[2];
}

j'essaye ensuite de convertir joueur[1] en ange mais je n'y arrive pas j'ai essayé ces queslques méthodes:

joueur[1] = Ange(j1, plateau.getDim()/2, plateau.getDim()/2);

joueur[1] = new Ange(j1, plateau.getDim()/2, plateau.getDim()/2);

joueur[1]->Ange(j1, plateau.getDim()/2, plateau.getDim()/2);

Ange joueur[1] = new Ange(j1, plateau.getDim()/2, plateau.getDim()/2);

Mais a chaque fois je me retrouve avec le message d'erreur comme quoi joueur[1] est un joueur.

 

Vous auriez une idée ?

 

Merci d'avance



#32 Sylva ETOKABEKA

Sylva ETOKABEKA

    Member

  • Étudiant
  • PipPip
  • 23 messages
  • Cursus:M.Sc.2

Posté 19 février 2015 - 01:43

je pencherais plutôt pour cette methode

joueur[1] = new Ange(j1, plateau.getDim()/2, plateau.getDim()/2);

 de plus du créer ton ange et demon dans le constructeur de la partie.



#33 Paul VENET

Paul VENET

    Member

  • Étudiant
  • PipPip
  • 23 messages
  • LocationMontpellier

Posté 19 février 2015 - 02:04

je pencherais plutôt pour cette methode

joueur[1] = new Ange(j1, plateau.getDim()/2, plateau.getDim()/2);

 de plus du créer ton ange et demon dans le constructeur de la partie.

quand je fais ça je me retrouve avec cette erreur : no match for 'operator=' (operand types are 'Joueur' and 'Ange*')|



#34 Mathieu STEFANI

Mathieu STEFANI

    Member

  • Étudiant
  • PipPip
  • 67 messages
  • Cursus:A.Sc.1

Posté 19 février 2015 - 02:50

Visiblement, tu as déclaré un tableau de type Joueur et non Joueur*:

Joueur* joueurs[2] = {
    new Ange(j1, plateau.getDim() / 2, plateau.getDim() / 2),
    new Demon(j2)
};


#35 Paul VENET

Paul VENET

    Member

  • Étudiant
  • PipPip
  • 23 messages
  • LocationMontpellier

Posté 19 février 2015 - 02:56

 

Visiblement, tu as déclaré un tableau de type Joueur et non Joueur*:

Joueur* joueurs[2] = {
    new Ange(j1, plateau.getDim() / 2, plateau.getDim() / 2),
    new Demon(j2)
};

d'accord mais dans le .h on déclare :

class Partie
{
    public:
        Partie();
        virtual ~Partie();
    protected:
    private:
        Plateau plateau;
        Joueur *joueur;

};

et non l'inverse.

 

Et quand je fais ce que tu m'a montré, lorsque que je fais :

joueur[1]->modifierCase(plateau.getDim()/2, plateau.getDim()/2);

Il ne le prend pas comme étant un ange mais comme étant un joueur



#36 Mathieu STEFANI

Mathieu STEFANI

    Member

  • Étudiant
  • PipPip
  • 67 messages
  • Cursus:A.Sc.1

Posté 19 février 2015 - 03:05

Bah dans le .h, il suffit de déclarer Joueur *joueurs[2]; et non Joueur* joueur;

 

 

 

Il ne le prend pas comme étant un ange mais comme étant un joueur

 

As-tu bien respecté les règles inhérentes au polymorphisme ? i.e modifierCase doit être virtual (elle doit être virtuelle pure dans Joueur idéalement).



#37 Paul VENET

Paul VENET

    Member

  • Étudiant
  • PipPip
  • 23 messages
  • LocationMontpellier

Posté 19 février 2015 - 03:08

Bah dans le .h, il suffit de déclarer Joueur *joueurs[2]; et non Joueur* joueur;

 

 

As-tu bien respecté les règles inhérentes au polymorphisme ? i.e modifierCase doit être virtual (elle doit être virtuelle pure dans Joueur idéalement).

J'ai fais tous ça oui mon tableau de joueur est de taille 2 et :

class Joueur
{
    public:
        Joueur();
        Joueur(string p);
        virtual ~Joueur();
        void saisir();
        virtual bool incorrect(int l, int c);
        void choisirCase();
        virtual void modifierCase();
        void Jouer();
        void setPseudo(string j);
        string getPseudo();
    protected:
        string pseudo;
        int sLigne;
        int sColonne;
    private:





#include "Joueur.h"

using namespace std;

class Ange : public Joueur
{
    public:
        Ange();
        Ange(string j, int l, int c);
        virtual ~Ange();
        void modifierCase(int l, int c);
        bool incorrect(int l, int c);
    protected:
    private:
        int ligne;
        int colonne;
};


#38 Mathieu STEFANI

Mathieu STEFANI

    Member

  • Étudiant
  • PipPip
  • 67 messages
  • Cursus:A.Sc.1

Posté 19 février 2015 - 03:39

C'est là où C++11 et le mot-clé override serait venu à ta rescousse. Indice: http://ideone.com/KPIJ1k



#39 Paul VENET

Paul VENET

    Member

  • Étudiant
  • PipPip
  • 23 messages
  • LocationMontpellier

Posté 19 février 2015 - 04:29

ça avance pas mon problême mais c'est pas grave.

Je vais tous recommencer de zéro on verra bien si je m'en sort mieux



#40 Mathieu STEFANI

Mathieu STEFANI

    Member

  • Étudiant
  • PipPip
  • 67 messages
  • Cursus:A.Sc.1

Posté 19 février 2015 - 05:50

Ça l'avance si tu prends le temps de comprendre l'erreur :)


  • Vincent VIEIRA aime ceci





Aussi étiqueté avec au moins un de ces mots-clés : C++, CPP

5 utilisateur(s) li(sen)t ce sujet

0 membre(s), 5 invité(s), 0 utilisateur(s) anonyme(s)