Partage
  • Partager sur Facebook
  • Partager sur Twitter

Appel au constructeur de la classe de base

Sujet résolu
    5 janvier 2021 à 20:24:59

    Bonsoir, Je ne comprends pas pourquoi le 1e code fonctionne et le second me renvoie l'erreur :

    Magicien.cpp:15:31: error: cannot call constructor ‘Personnage::Personnage’ directly [-fpermissive]
       15 |     Personnage::Personnage(nom);

    Je suis le cours de C++ d'OpCl et je ne vois pas d'explication. Merci d'avance pour les réponses. Un débutant en C++.

    Magicien::Magicien(string nom) : Personnage(nom), m_mana(100)
    {
    
    }
    Magicien::Magicien(string nom)
    {
        Personnage::Personnage(nom);
        m_mana = 100;
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      5 janvier 2021 à 20:49:23

      1. Parce que tu ne peux pas appeler le constructeur directement... c'est écrit. C'est comme ca, c'est le langage qui veut ca.

      2. change de cours

      • Partager sur Facebook
      • Partager sur Twitter
        5 janvier 2021 à 21:03:32

        gbdivers a écrit: > 0. Merci pour ta réponse

        1. je pensais que les deux syntaxes étaient équivalentes.

        2. Pourquoi ? (cette question est facultative). As tu un cours à me recommander ?

        -
        Edité par Pyrizer 5 janvier 2021 à 21:38:18

        • Partager sur Facebook
        • Partager sur Twitter
          5 janvier 2021 à 21:38:26

          Pyrizer a écrit:

          1. je pensais que les deux syntaxes étaient équivalentes.

          Il faut savoir que quand les constructeurs des classes de base n'est pas explicitement appelé, il est quand même appelé implicitement par le compilateur. Idem pour les membres.

          Donc :

          Magicien::Magicien(string nom)
          {
              Personnage::Personnage(nom);
              m_mana = 100;
          }

          est équivalent à :

          Magicien::Magicien(string nom) : Personnage(), m_mana(0)
          {
              Personnage::Personnage(nom);
              m_mana = 100;
          }

          Pour m_mana, cela veut dire que tu fais une initialisation par défaut puis tu modifies la valeur. Ce qui est valide, mais moins performant. Alors qu'avec le code suivant :

          Magicien::Magicien(string nom) : Personnage(nom), m_mana(100)
          {
          }

          tu initialises directement m_mana avec la bonne valeur. Donc cette syntaxe est plus efficace.

          Pour "Personnage::Personnage(nom);", c'est comme si tu essayais d'initialiser 2 fois la classe de base. Ce qui n'aurait pas de sens. Donc c'est interdit.

          Pyrizer a écrit:

          1. Pourquoi ? (cette question est facultative). As tu un cours à me recommander ?

          Parce qu'il n'a pas été mis à jour depuis longtemps, il est obsolète et il contient des erreurs.

          Le cours sur Zeste de Savoir.

          • Partager sur Facebook
          • Partager sur Twitter
            5 janvier 2021 à 22:04:02

            gbdivers a écrit: > Merci beaucoup je vais voir ça !

            -
            Edité par Pyrizer 5 janvier 2021 à 22:05:06

            • Partager sur Facebook
            • Partager sur Twitter

            Appel au constructeur de la classe de base

            × 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