Partage
  • Partager sur Facebook
  • Partager sur Twitter

cannot declare parameter 'grille' to be of abstrac

    24 octobre 2020 à 13:17:44

    Bonjour,

    Je suis débutant en C++ et encore plus sur le polymorphisme. Je rencontre un problème avec la création de mon jeu du morpion/Puissance 4 j'ai une erreur de type cannot declare parameter 'grille' to be of abstract type 'Grille' Game(Grille grille) que QT me génère.

    Main.cpp

    int main(int argc, char *argv[])
    {
        Game(GrilleMorpion());
    }

    Game.h

    class Game
    {
    public:
        Game(Grille grille);
    };
    

    Game.cpp

    Game::Game(Grille _grille)
    {
        _grille.jeu();
    }
    

    Grille.h

    class Grille
    {
        public:
            bool grilleFull();
            void reset();
            virtual void print() = 0;
            virtual void jeu() = 0;
        protected:
            std::vector<std::vector<Case>> m_Grille;
    };
    

    GrilleMorpion.h

    class GrilleMorpion : public Grille
    {
    public:
        GrilleMorpion();
        bool emptyCase(Case c);
        void placeAToken(Case c, int& idJoueur);
        bool completeLine(int IdLine, int& idPlayer);
        bool completeCol(int IdCol, int& idPlayer);
        bool completeDiag(int IdDiag, int& idPlayer);
        bool gameWinner(int idJoueur);
    
        virtual void jeu();
        virtual void print();
    
        void startGame();
        void init();
        Case saisiePlayer(int& player);
        void nextPlayer(int& PlayerCourant);
    };

    GrilleMorpion.cpp

    void GrilleMorpion::print(){
        for (int i = 0; i < m_Grille.size(); i++) {
            for (int j = 0; j < m_Grille[i].size(); j++) {
                std::cout <<  m_Grille[i][j].Val << " ";
            }
            std::cout << std::endl;
        }
    }
    
    void GrilleMorpion::jeu(){
        startGame();
    }
    

    Si une personne peu m'aider pour que je comprenne comment faire. Puisque j'aimerai transmettre m'importe quel jeu dans ma classe game et le lancer.



     

    • Partager sur Facebook
    • Partager sur Twitter
      24 octobre 2020 à 13:37:49

      Ici ta classe Grille est une classe abstraite car elle possède au moins une méthode virtuelle pure, autrement dit tu ne peux pas directement créer une instance de ta classe comme tu le fais ici 

      class Game
      {
      public:
          Game(Grille grille);
      };

      Il faudrait utiliser un pointeur (de préférence intelligent) ou simplement une référence

      class Game
      {
      public:
          Game(Grille& grille);
      };

      Ou simplement, plutôt que de apsser un objet de type Grille, passer un objet de type GrilleMorpion qui même si elle hérite de Grille, n'est pas abstraite puisque tu as correctement redéfini toutes les virtuelles pures.

      class Game
      {
      public:
          Game(GrilleMorpion grille);
      };

      Sans oublier de le passer en référence constante si tu ne comptes pas le modifier dans ton constructeur ici

      class Game
      {
      public:
          Game(const GrilleMorpion& grille);
      };




      -
      Edité par AmirProg 24 octobre 2020 à 13:41:43

      • Partager sur Facebook
      • Partager sur Twitter
        24 octobre 2020 à 13:41:41

        Bonjour,

        Tu as défini la classe Grille comme abstraite. Cela veut dire qu'aucun objet Grille ne peut exister. On ne peut donc par avoir une fonction qui recevrait la copie d'un objet Grille.

        Par contre tu peux avoir une fonction qui référence quelque chose qui aurait les caractéristiques d'une Grille.

        • Partager sur Facebook
        • Partager sur Twitter

        En recherche d'emploi.

          24 octobre 2020 à 13:45:16

          D'accord maintenant j'ai deux questions premièrement est ce que je change mon main.cpp ? Deuxièmement si maintenant je fais ta deuxième option et que je veux passer une paramètre une autre grille qui n'est pas une grillemorpion mais une grillePuissance4 cela marchera aussi ? 

          • Partager sur Facebook
          • Partager sur Twitter
            24 octobre 2020 à 13:50:42

            Non, tu ne peux pas faire ça:

            game(GrilleMorpion grille)
            {}

            Puis lui passer un objet d'une classe qui n'hérite pas de GrilleMorpion

            En revanche, si ce que tu souhaites est de pouvoir accepter tous les types de grilles différents héritant de Grille, tu peux procéder comme ça :

            game(Grille& grille)
            {}

            Il faut néanmoins que tu fasses attention à ce que toutes tes classes qui héritent de grille puissent s'utiliser de la même manière

            Edit : Il faut aussi te demander si il est vraiment intéressant d'avoir une classe GrilleMorpion, GrillePuissance4 si dans les faits, seules les dimensions changent.

            Peut-être qu'une seule classe Grille serait suffisante, qui te représenterait n'importe quelle grille 2D, et t'offrirait les services que tu t'attendrais à recevoir d'une grille, puis ta logique de jeu implémentée dans ta classe Game par exemple travaillerait différemment avec cet objet de type Grille en fonction du type de jeu, morpion, puissance 4.

            -
            Edité par AmirProg 24 octobre 2020 à 14:04:57

            • Partager sur Facebook
            • Partager sur Twitter

            cannot declare parameter 'grille' to be of abstrac

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown