IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Heritage] appel au constructeur de la classe mère


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut [Heritage] appel au constructeur de la classe mère
    Bonjour,

    J'ai un soucis à la compilation, mais pourtant tout porte à croire que mon code est conforme :

    J'ai :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class MeasureLineBase : public ModellerEntity
    {
     
    public:
     
    	/** Define the mode of the measureLine */
    	enum MeasureLineMode{
    		/** Default mode */				NORMAL,				
    		/** With billboard decal */		WITH_DECAL,			
    		/** With regular graduations */	WITH_GRADUATION		
    	};
     
    	MeasureLineBase();
    	MeasureLineBase(MeasureLineMode mode);
    }
    j'ai ensuite une classe qui herite de cette derniere :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class PointMeasureLine : public MeasureLineBase
    {
     
    public:
    	PointMeasureLine(MeasureLineMode mode);
    }
    Je chercher à faire en sorte que le constructeur de PointMeasureLine(MeasureLineMode mode) apelle le constructeur de MeasureLineBase(MeasureLineMode mode) en trasnmettant son argument.

    J'ai donc fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PointMeasureLine::PointMeasureLine(MeasureLineMode mode = NORMAL) : MesureLineBase(mode)
    {
     
    }
    mais le compilateur refuse... :

    error C2614: 'PointMeasureLine'*: initialisation de membre non conforme*: 'MesureLineBase' n'est ni une base ni un membre
    Auriez vous une idée ? car là je ne vois vraiment pas ce qui le dérange...

    Merci
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Tu devrais déjà prendre l'habitude de passer tes paramètres sous la forme de référence (dans bien des cas constante) à te constructeurs.

    Ceci dit, lorsque le constructeur de la classe de base a besoin d'un paramètre pour pouvoir être appelé, il "suffit" de l'appeler en lui passant le bon paramètre dans la liste d'initialisation

    Ainsi, lorsque tu as une classe de base sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Base
    {
        public:
            Base( UnType const& ut);
    };
    et une classe dérivée sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Derivee : public Base
    {
        public:
            Derivee(UnType const& ut);
    }
    Le constructeur de Derivee est à implémenter sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Derivee::Derivee(UnType const& ut):Base(ut)/*, autres membres de Derivee */
    {
        /* post conditions */
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Salut,

    Merci de ta réponse.

    Cependant le code que tu explique est le meme que celui que j'utilise, non ?

    J'ai réécrit à nouveau, et cette fois ça marche... Donc soit VSC++ a craqué... soit il y a un petit détail quelque part qui m'a échappé.

    En tout état de cause, ça marche a présent.
    Désolé pour le post ( inutile ) , j'étais pressé par le temps et incompris de mon compilateur
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  4. #4
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Bonjours,
    Ça y est j'ai vu ce qui n'allait pas^^
    C'était pas facile :p

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PointMeasureLine::PointMeasureLine(MeasureLineMode mode = NORMAL) : MeasureLineBase(mode)
    C'est juste une faute de frappe, il manque un 'a' dans l'appel au constructeur de la classe mère. Ce qui explique le message d'erreur.

    'MesureLineBase' n'est ni une base ni un membre
    C'est vrai.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Ange_blond Voir le message
    J'ai réécrit à nouveau, et cette fois ça marche... Donc soit VSC++ a craqué... soit il y a un petit détail quelque part qui m'a échappé.
    Il y a un petit détail qui t'a échapé (du moins, si le code fourni est un copier/coller fidèle du tien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class PointMeasureLine : public MeasureLineBase
    {
     
    public:
    	PointMeasureLine(MeasureLineMode mode);
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PointMeasureLine::PointMeasureLine(MeasureLineMode mode = NORMAL) : MesureLineBase(mode)
    [EDIT] Fichtre, doublé sur la ligne d'arrivé !

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Par contre je suis très étonné de la valeur par défaut....
    Ca ne devrait pas compiler, si ?

    Normalement la valeur par défaut est donnée dans la déclaration, pas dans l'implémentation (sinon les utilisateurs de la classe vont avoir du mal à le trouver)
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Par contre je suis très étonné de la valeur par défaut....
    Ca ne devrait pas compiler, si ?

    Normalement la valeur par défaut est donnée dans la déclaration, pas dans l'implémentation (sinon les utilisateurs de la classe vont avoir du mal à le trouver)
    En fait, la norme (8.3.6 - Item 4 ) semble dire que c'est possible mais la prise en compte de la valeur par défaut sera conditionnée par la portée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void f(int);
     
    void g()
    {
       f();//erreur
    }
    void f(int i=0){
    }
    void h()
    {
       f();//OK
    }

  8. #8
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Par contre je suis très étonné de la valeur par défaut....
    Ca ne devrait pas compiler, si ?
    Je me suis dit la même chose.
    Mais peut être que si tout est dans le .h ça marche non?

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Par contre je suis très étonné de la valeur par défaut....
    Ca ne devrait pas compiler, si ?
    Pourquoi pas?

    Normalement la valeur par défaut est donnée dans la déclaration, pas dans l'implémentation (sinon les utilisateurs de la classe vont avoir du mal à le trouver)
    Les definitions sont des declarations.

    La valeur par defaut ne doit etre donne que dans une seule declaration (qu'elle soit aussi une definition ou non).

    C'est vrai que c'est surtout utile quand il n'y a pas de declaration separee de la definition (definition dans un namespace anonyme par exemple).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Vous avez l'oeil merci :-)

    Au moins a présent je sais que ce n'était pas VS mais bien moi qui, pour une fois, aurait mieux fait de faire un copier-coller

    Merci.
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/03/2010, 23h46
  2. C++ : appel de constructeur de la classe mère
    Par ch4mp dans le forum BOUML
    Réponses: 2
    Dernier message: 02/01/2008, 14h35
  3. Réponses: 12
    Dernier message: 13/10/2007, 11h37
  4. [POO]Appelé une méthode d'une classe mère
    Par LE NEINDRE dans le forum Langage
    Réponses: 2
    Dernier message: 14/12/2005, 14h44
  5. Réponses: 5
    Dernier message: 20/11/2005, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo