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 :

Appel explicite du constructeur de recopie ?


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    E/C
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : E/C

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut Appel explicite du constructeur de recopie ?
    Bonjour,

    J'ai un petit problème de fond sur la relation héritage multiple/constructeur de recopie.

    Soit une classe FILS qui hérite de deux classes MERE1 et MERE2, toutes deux dotées d'un constructeur de recopie en bonne et due forme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class FILS : public MERE1, public MERE2
    {
       ...
    }
    Si la classe fils n'a pas de constructeur de recopie déclaré, alors en cas de création par copie, les deux constructeurs de recopie des classes MERE sont appellé automatiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FILS a;
    FILS b = a;	// appel des constructeur de recopie de MERE1 et MERE2
    Je souhaite lors de la copie, passer explicitement à MERE1 un argument particulier. En effet, celle-ci est une classe "enregistreuse", qui "piste" les allocations mémoire. Je veux donc lui dire qu'on est en train de créer un objet de type FILS.

    Je définit alors un constructeur de recopie pour FILS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    FILS( const FILS& f ) : MERE1( MN_FILS ) // MN_... : Magic Number identifiant le type
    {
    ...ici des recopie des element propres à fils
    	attr1 = f.attr1;
    }
    Problème : dans ce cas, comme je viens de définir un constructeur de recopie pour FILS, celui de MERE2 n'est plus appelé !

    Je pourrais bien sûr dupliquer ce qu'il fait dans le constructeur de recopie de FILS, mais ça ne serait pas très élégant...

    Y a-t-il une solution pour appeler explicitement le constructeur de recopie d'une classe dont on hérite ?
    Ou alors une autre solution ?

    Je pense que la solution au problème concret (traçage des allocation) pourrait se résoudre par l'utilisation de l'identification dynamique de type (typeinfo / typeid), mais le fond de la question (appel explicite du constructeur de recopie d'une classe de base) m'intéresse quand même.

    Merci d'avance pour vos réponses.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ceci ne marche-t-il pas ?
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FILS( const FILS& f ) : MERE1( MN_FILS ), MERE2(f)
    {
    	//...
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    E/C
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : E/C

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Arghh... Mais c'est bon sang bien sûr...
    Désolé pour la question bête, mais quand on a la tête dans le guidon, on ne voit pas les choses les plus évidentes...

    Je ne voyais pas le constructeur de recopie comme un constructeur "normal", et donc n'avait pas envisagé son appel direct dans la liste d'initialisation.

    Merci en tout cas !

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Problème : dans ce cas, comme je viens de définir un constructeur de recopie pour FILS, celui de MERE2 n'est plus appelé !
    Si, il est toujours appelé. Sauf que c'est le constructeur par défaut qui l'est.

    Sinon, à part ça, n'utilise pas des noms de classes en majuscules.
    L'usage veut que les majuscules soient réservées pour les macros, ou éventuellement les enums.

  5. #5
    Membre averti
    Profil pro
    E/C
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : E/C

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Si, il est toujours appelé. Sauf que c'est le constructeur par défaut qui l'est.
    Ahhhh, non, désolé ! J'ai fait la manip, et le constructeur DE RECOPIE de la classe mère, qui existe, n'est pas appelé ! Par contre, oui, bien sur, le constructeur sans arguments est bien appelé.

    Sinon, à part ça, n'utilise pas des noms de classes en majuscules.
    L'usage veut que les majuscules soient réservées pour les macros, ou éventuellement les enums.
    Oups, j'aurais du faire attention, et convertir en minuscule...

    En fait, c'est une convention toute personnelle, que j'ai adopté il y a quelques années, de mettre tous les types de données en majuscules, classes, structures, et enum (en plus des macros, evidemment). Ce n'est pas très usuel, j'en conviens, mais ça a l'avantage pour moi, quand je survole du code "ancien", de différencier visuellement et de façon instantanée et "transparente" (c.-à.-d., sans avoir besoin de solliciter mon cerveau...) ce qui est un identificateur (variable/fonction) de ce qui est un type de donnée.

    Par exemple, je trouve la déclaration suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MON_TYPE CeciEstLaFonctionBidule( VACHE* nomdemavache, CHIEN* mon_chien, LISTE_TRUCS& uneliste );
    plus "rapidement assimilable" que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    montype CeciEstLaFonctionBidule( vache* nomdemavache, chien* mon_chien, listetrucs& uneliste  );
    Mais c'est bien sûr une histoire d'habitude...

    De plus, en C++, le rôle des macros tend à se réduire par rapport au C, non ? Donc, les possibilités de confusions sont minimes...

    C'est tout personnel, si un jour je travaille avec des gens que ça gène, pas de problème, je switcherai pour quelque chose de plus usuel...Pour l'instant, y'a que moi qui lit mon code

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je me souviens d'un prof conseillant de commencer toute classe par une majuscule. C'est aussi la convention utilisée en Java et en .Net, mais en .Net elle perd un peu de son importance car les méthodes et propriétés commencent également par une majuscule...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Tout mettre en minuscule n'est pas une bonne idée non plus.

    Tout est affaire de gout et d'accord entre les gens, mais l'une des facons de faire les plus usuelles c'est d'utiliser le CamelCase.

    2 manieres de faire :

    UpperCamelCase pour tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonType CeciEstLaFonctionBidule( Vache* nomdemavache, Chien* mon_chien, ListeTrucs& uneliste  );
    La maniere Java : l'UpperCamelCase pour les noms des classes et le lowerCamelCase pour les methodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonType ceciEstLaFonctionBidule( Vache* nomdemavache, Chien* mon_chien, ListeTrucs& uneliste  );

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

Discussions similaires

  1. appel explicite au constructeur
    Par exhortae dans le forum C++
    Réponses: 17
    Dernier message: 01/03/2008, 16h05
  2. Constructeur par recopie
    Par KernelControl dans le forum C++
    Réponses: 2
    Dernier message: 29/12/2005, 12h24
  3. Appel recursif au constructeur
    Par Math75 dans le forum C++
    Réponses: 1
    Dernier message: 11/10/2005, 15h48
  4. constructeur de recopie:question theorique
    Par voyageur dans le forum C++
    Réponses: 7
    Dernier message: 02/12/2004, 22h46
  5. Constructeur par recopie
    Par sdebrois dans le forum Composants VCL
    Réponses: 13
    Dernier message: 21/10/2004, 14h47

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