Partage
  • Partager sur Facebook
  • Partager sur Twitter

Classe et pointeur

Sujet résolu
    23 septembre 2020 à 23:56:08

    Salut :),

    j'ai écrit le code comme dans le cours, mais le compilateur retourne une erreur :" Arme does not name a type" j'ai compris le message que c'est  pas un type comme (int, double ..) mais dans le cours "les classes et pointeurs" c'est  écrit comme ça !! je comprends pas !

    voilà une capture :

    Merci pour votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
      24 septembre 2020 à 2:59:05

      Laissez tomber au plus tôt le cours de C++ de ce site, qui est une calamité.

      Par exemple, celui de zeste de savoir semble beaucoup mieux.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        24 septembre 2020 à 7:47:53

        Salut,

        Bien que je plussoie au commentaire de bacelar concernant le cours, et pour que tu comprenne quand même le problème:

        Il faut savoir que le compilateur va "lire" ton code exactement de la même manière que tu lirais un bon roman: une ligne après l'autre, du début à la fin.

        Il va donc subir le même problème que toi: arrivé à la ligne 10, il "sait" tout ce qui s'est passé pendant les neuf premières lignes, mais n'a aucune idée de ce qui se passe à la ligne 12 ou à la ligne 15, de la même manière que toi, arrivé à la page 10, tu sais ce qui s'est passé les neuf premières pages, mais n'a aucune idée de ce qui se passe à la page 12.

        En outre, il oublie systématiquement tout ce qu'il a pu apprendre en traitant une unité de compilation (faisons simple: un fichier portant l'extension *.cpp, ainsi que le contenu de tous les fichier d'en-tête *.h / *.hpp inclus de manière directe ou indirecte) lorsqu'il commence à travailler sur une nouvelle unité de compilation

        Enfin, il est du genre pointilleux, et, s'il rencontre quelque  chose dont il n'a "jamais entendu parler", il ne saura pas à quoi cela peut correspondre, et du coup, sa seule solution sera d'arrêter le travail après t'avoir émis un message indiquant le problème.

        Dans le cas présent, le compilateur se plaint de ne pas connaitre la classe Arme, ce qui peut arriver pour différentes raisons:

        • Soit, tu n'as simplement pas signalé au compilateur que la classe Arme existait, que ce soit en utilisant une déclaration anticipée ou  en incluant le fichier d'en-tête dans lequel la classe Arme est définie
        • soit tu te trouve dans une situation dans laquelle le fichier Personnage.hpp inclut le fichier Arme.hpp, alors que le fichier Arme.hpp inclut le fichier Personnage.hpp.

        Le deuxième cas aura en effet pour résultat le fait que, la classe Arme ayant besoin de la classe Personnage et inversement, il y aura toujours une des classes qui aura besoin de connaitre ... la classe qui sera définie "après", et donc de faire raler le compilateur.

        Le meilleur moyen est donc d'utiliser les déclarations anticipées, déjà citées, sous une forme proche de

        class Arme; // déclaration anticipée: le compilateur sait,
                    // à partir de cette ligne, que la classe Arme
                    // existe
        class Personnage{
        
        private:
            Arme * m_arme; // OK, le compilateur connait la classe
                           // Arme
        }

        ( cela fonctionne avec les pointeurs et les références).

        Il n'y a qu'avec les données manipulées sous forme de valeur (ex: Arme arme;) que les déclarations anticipées ne fonctionneront pas, car le compilateur doit savoir, en plus du fait que la classe Arme existe, exactement quelle est la taille de la classe Arme pour pouvoir déterminer la taille de la classe Personnage.

        Ceci étant dit: l'accessibilité protected est géniale pour permettre à des classes dérivées (ex: Guerrier) de connaître "certaines choses" qui sont définie dans la classe parente (Personnage) et qui doivent rester "cachées" au "monde extérieur".

        Cependant, c'est une très mauvaise idée que de placer des données qui appartiennent à la classe parent, pour toute une série de raisons.  A priori, nous limiteront le contenu de l'accessibilité protégée à uniquement des fonctions, qui permettront à la classe dérivée de manipuler les données de la classe de base sans même avoir à s'inquiéter de la forme qu'elles prennent ;)

        • Partager sur Facebook
        • Partager sur Twitter
        Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
          24 septembre 2020 à 13:00:56

          bacelar :

           Merci je vais l’essayer !

          koala01 :

          Merci pour votre explication ... effectivement avec la déclaration anticipée ça marche la chose qui est nouvelle pour moi!

          Merci encore une fois :)

          • Partager sur Facebook
          • Partager sur Twitter

          Classe et pointeur

          × 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