Partage
  • Partager sur Facebook
  • Partager sur Twitter

Constructeur de classe Dérivée

"appel ambigus" de la part du Compilateur

Sujet résolu
    5 décembre 2006 à 12:53:31

    Tout d'abord, Bonjour.
    J'ai un petit problème avec un héritage de classe...

    En suivant exactement le même protocole, une classe mère et se dérivée fonctionne et pas l'autre classe mère et se dérivée... Le compilo me dit "error C2668: 'CPersonnes::CPersonnes' : ambiguous call to overloaded function" et qu'il y a définition de plusieurs constructeurs par défaut...

    Sauriez-vous d'ou ça peut venir??
    D'avance Merci.

    voici le code:

    #ifndef _CPERSONNES_H_
    #define _CPERSONNES_H_


    #define VISUAL


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>


    #ifdef VISUAL
    #include <iostream.h>
    #endif


    const int l_nom=60;
    const int l_pre=60;
    const int l_nai=11;

    #define NUM unsigned int

    class CPersonnes
    {
    friend ostream& operator<<(ostream& s, const CPersonnes& P);

    protected:
    char *nom;
    char *prenom;
    char *naissance;

    public:
    CPersonnes();
    CPersonnes(char *n=0, char *p=0, char *d=0);
    CPersonnes(const CPersonnes& P);
    virtual ~CPersonnes();

    //get set
    char* getNom() const {return nom;}
    char* getPrenom() const {return prenom;}
    char* getNaissance() const {return naissance;}

    void setNom(const char *n);
    void setPrenom(const char *p);
    void setNaissance(const char *d);

    //methode classe
    virtual void affiche() const;
    };




    class CMembrePersonnel:public CPersonnes
    {
    //friend ostream& operator<<()

    protected:
    NUM numperso;

    public:
    CMembrePersonnel():CPersonnes()
    {
    numperso=0;
    }

    CMembrePersonnel(char *n, char *p, char *d, NUM nu):CPersonnes(n, p, d)
    {
    setNumperso(nu);
    }

    CMembrePersonnel( const CPersonnes& P, const CMembrePersonnel& M): CPersonnes(P)
    {
    setNumperso(M.getNumperso());
    }

    //virtual~CMembrePersonnel(void){;}

    //get set
    getNumperso() const {return numperso;}

    setNumperso(const NUM n){numperso=n;}

    //methode classe
    virtual void affiche() const;

    };

    #endif
    • Partager sur Facebook
    • Partager sur Twitter
      5 décembre 2006 à 17:28:49



      #ifndef _CPERSONNES_H_
      #define _CPERSONNES_H_


      #define VISUAL


      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>


      #ifdef VISUAL
      #include <iostream.h>
      #endif


      const int l_nom=60;
      const int l_pre=60;
      const int l_nai=11;

      #define NUM unsigned int

      class CPersonnes
      {
              friend ostream& operator<<(ostream& s, const CPersonnes& P);

              protected:
                      char *nom;
                      char *prenom;
                      char *naissance;

              public:
                      CPersonnes();
                      CPersonnes(char *n=0, char *p=0, char *d=0);
                      CPersonnes(const CPersonnes& P);
                      virtual ~CPersonnes();

                      //get set
                      char* getNom()      const {return nom;}
                      char* getPrenom()              const {return prenom;}
                      char* getNaissance()    const {return naissance;}

                      void setNom(const char *n);
                      void setPrenom(const char *p);
                      void setNaissance(const char *d);

                      //methode classe
                      virtual void affiche() const;
      };




      class CMembrePersonnel:public CPersonnes
      {
              //friend ostream& operator<<()

              protected:
                      NUM numperso;

              public:
                      CMembrePersonnel():CPersonnes()
                      {
                              numperso=0;
                      }

                      CMembrePersonnel(char *n, char *p, char *d, NUM nu):CPersonnes(n, p, d)
                      {
                              setNumperso(nu);
                      }

                      CMembrePersonnel( const CPersonnes& P, const CMembrePersonnel& M): CPersonnes(P)
                      {
                              setNumperso(M.getNumperso());
                      }

                      //virtual~CMembrePersonnel(void){;}

                      //get set
                      getNumperso() const {return numperso;}

                      setNumperso(const NUM n){numperso=n;}

                      //methode classe
                      virtual void affiche() const;

      };

      #endif


      c'est pas mieu :)
      • Partager sur Facebook
      • Partager sur Twitter
        5 décembre 2006 à 17:48:12

        le problème est clair non ?
        il vient de la déclaration de tes constructeurs.
        CPersonnes();
        CPersonnes(char *n=0, char *p=0, char *d=0);


        quand tu fais :
        CPersonnes *p = new CPersonnes();

        le compilo ne sait pas s'il doit appeller :
        CPersonnes::CPersonnes();

        ou
        CPersonnes::CPersonnes(0,0,0);
        • Partager sur Facebook
        • Partager sur Twitter
          5 décembre 2006 à 18:39:41

          Dexter: oui, si, en effet c'est beaucoup mieux, merci.

          minirop: j'avais jamais pensé à ça, c'est la première fois que j'utilisais une valeur par défaut pour tous les arguments... Mais c'est à retenir.


          Au fait pourquoi est-on obligé d'implémenter le code des constructeurs de la fonction dérivée dans le .h?
          • Partager sur Facebook
          • Partager sur Twitter
            5 décembre 2006 à 19:27:13

            On n'est pas obligé d'implémenter le code des constructeurs de la fonction dérivée dans le .h.

            Au fait, tu utilises <iostream.h>, c'est dépassé (il faut mettre <iostream>).

            Tu pourrais utiliser Visual C++ Express 2005 (gratuit), ou MinGW.
            • Partager sur Facebook
            • Partager sur Twitter
              5 décembre 2006 à 19:54:29

              Citation : HanLee

              On n'est pas obligé d'implémenter le code des constructeurs de la fonction dérivée dans le .h.

              Au fait, tu utilises <iostream.h>, c'est dépassé (il faut mettre <iostream>).

              Tu pourrais utiliser Visual C++ Express 2005 (gratuit), ou MinGW.



              Visual 2005, c'est une excellente idée, de plus il faut que j'y passe. Mais je ne connais pas bien les différences qu'il y a entre 6.0 et 2005 et je ne sais pas comment faire un portage rapide et en douceur de certains codes (C++). Sans quoi, ce serait chose faite. De toute manière, il faudra bien que je me jette à l'eau.
              • Partager sur Facebook
              • Partager sur Twitter
                5 décembre 2006 à 21:08:43

                > Darkelfe : oui mais CodeBlocks ne t'impose pas d'utiliser un compilateur précis, même s'il y a l'option GCC avec.

                > Goblins : il me semble qu'il y a un convertisseur de projet Visual C++ 6.0 vers Visual C++ 2005, mais pas sûr.
                • Partager sur Facebook
                • Partager sur Twitter
                  5 décembre 2006 à 21:19:03

                  Citation : Darkelfe

                  ou code blocks


                  CodeBlocks est un IDE qui utilises mingW par défaut. :-°
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Constructeur de classe Dérivée

                  × 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