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 et type de retour des methodes


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut Heritage et type de retour des methodes
    Bonjour a tous, ca fait un peut de temp que j'essaie de resoudre ce probleme -_- mais rien a faire

    Voila j'ai une methode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual Noeud& filsGauche()  =0;
    define dans una classe abstrate Noeud

    Ce une reference, mais etant abstraite je n'ai pas trouve autre chose pour eviter que G++ ne rale.

    Maintenant je cree la classe NoeudV et je veut redefinir la methode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NoeudV& filsGauche() {return NoeudV(2*index+1,infos);}
    Bon ca ne marche pas, car on renvoie un NoeudV& qui est une reference vers un temporaire qui n'existe plus, alors je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NoeudV filsGauche() {return NoeudV(2*index+1,infos);}
    Mais il aprecie pas, il trouve que ce pas la meme -_- or si j'avait bien compris le type de retour n'est pas dans la signature de la fonction...

    Comment faire :'(

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Salut,

    Le type de retour fait partie de la signature de la fonction.

    Donc quand tu redéfinis une fonction virtuelle, il faut que le type de retour soit le même. La seule exception à cette règle : le type de retour de la fonction redéfinie peut être un type dérivé du type de retour de la fonction virtuelle. Mais dans ce cas il faut manipuler la variable de retour de manière "polymorphe" autrement dit via un pointeur ou une référence.

    En effet, si B dérive de A, il est possible d'affecter un B* à un A* ou un B à un A&, d'où cette possibilité de changement de type. Par contre il n'est pas possible d'affecter un B à un A.

    Si tu utilises une référence, tu n'as pas le choix, il faut que ta variable soit initialisée avant. Sinon tu peux retourner un pointeur et allouer celui-ci dans le corps de ta fonction avant de le retourner, mais je n'aime pas trop cette méthoe, l'ownership du pointeur est transférée de manière implicite.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut
    mmm mais pour l'avoir declarer avant ce n'est pas tjr evident non?
    Et je ne voit pas comment faire en tout cas dans le cas de ma classe ^^'

    Pour les pointeur, j'immagine donc que faire une methode qui fait directement un return ce n'est plus bon ^^"

    Mais pourquoi tu n'aime pas cette facon deja? (ce un travail pour mes cours donc si il y a des truc pas bien faut que jepuisse le savoir pour ecrire un code propres)

    Merci d'avance

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Le type de retour ne fait PAS partie de la signature de la fonction - pas au sens recherche de fonction qui va bien -, en revanche, il est analysé dans le cas d'une hiérarchie pour avoir une cohérence - le type de retour d'une hiérarchie fille doit hériter du type de retour dans la hiérarchie parente -. Et une référence transformée en non référence, ce n'est pas le même type, donc c'est dans le dernier cas que ça plante.

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Le polyrmohisme d'inclusion (en C++: héritage + redéfinition de fonctions membres virtuelle) ne me parait pas être ce qu'il y a de plus indiqué pour définir des arbres. Au contraire du polymorphisme paramétrique (C++: templates).

    Mais passons. De tous les arbres que j'ai manipulés, les noeuds existaient déjà avant qu'on les cherche et renvoie. Et du coup, après seuls des pointeurs se balladent.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut
    les template rentrerons dans un deuxieme temp ^^ ce un travail d'ecole j'ai donc des conigne a respecter.

    Mais j'envisage la solution avec des pointeur, meme si j'ai jamais vu ce gendre de code.

  7. #7
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual std::auto_ptr<Noeud> filsGauche()  = 0;
    Par exemple.

    Mais c'est bien sûr pas très bon.
    Je vois pas pourquoi tu devrais utiliser de l'héritage pour indiquer différents types de noeuds. Tout ce que tu peux différencier c'est les noeuds sans fils, sans fils gauche, sans fils droit, et avec les deux.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut
    oO et ce quoi ca?

    Tu n'aurait pas un lien vers un tuto qui explique stp?

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

Discussions similaires

  1. Type de retour des surcharges d'opérateur
    Par syl1405 dans le forum C++
    Réponses: 8
    Dernier message: 16/06/2010, 17h22
  2. creation de "TYPE OBJECT" avec des methodes
    Par TheBlackReverand dans le forum Oracle
    Réponses: 2
    Dernier message: 15/06/2009, 20h57
  3. Type de retour des WebMethod
    Par oclone dans le forum Services Web
    Réponses: 2
    Dernier message: 11/06/2009, 15h57
  4. Réponses: 6
    Dernier message: 18/04/2009, 11h37
  5. reflexion et type de retour des méthodes
    Par money mark dans le forum Langage
    Réponses: 2
    Dernier message: 09/04/2006, 18h46

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