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 :

Fonction avec divers return possibles


Sujet :

C++

  1. #1
    Membre régulier Avatar de inddzen
    Inscrit en
    Avril 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2004
    Messages : 133
    Points : 81
    Points
    81
    Par défaut Fonction avec divers return possibles
    Je vais essayer d'exposer mon probleme le plus clair possible

    Soit les classes A, B et C telles que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class B : public A
    {.....}
     
    class C : public A
    {.....}
    J'aimerai qu'une fonction puisse retourner une de ces classes selon la situation, i.e :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ????????? fonction()
    {
        if(quelque chose) 
            return B;
        else
            return C;
    }
    La ou il y les "?????" est bien sur la raison de ce post

    Est que quelqu'un aurais une idee?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Retourner une classe non, par contre tu peux retourner une instance de dérivée sous forme de A* :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    A* fonction()
    {
        if (quelque chose) 
            return new B;
        else
            return new C;
    }

  3. #3
    Membre régulier Avatar de inddzen
    Inscrit en
    Avril 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2004
    Messages : 133
    Points : 81
    Points
    81
    Par défaut
    En effet, j'ai oublie le "*" dsl

    Mais ce que je n'arrive pas a comprendre, c'est que les B et C heritent effectivement de A mais sont differentes de A. Elles ne sont composees que partiellement de A et ont leurs propres composants.

  4. #4
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    mécanisme de l'héritage -> toute bêtement B et C sont des A particuliers

  5. #5
    Membre régulier Avatar de inddzen
    Inscrit en
    Avril 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2004
    Messages : 133
    Points : 81
    Points
    81
    Par défaut
    Je devais certainement ronfler ce jour la en classe

  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
    Et oui... B hérite de A si et seulement si Best unA

    Donc "Carré" hérite de "Rectangle", qui possède pourtant plus d'informations.

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et oui... B hérite de A si et seulement si Best unA
    Hérite publiquement. Il ne faut pas oublier les autres types d'héritage. Par exemple pour l'héritage privé, on parle de "implémenté-en-terme-de" plutôt que de "est-un".

    Donc "Carré" hérite de "Rectangle"
    Il me semble que c'est justement le contre-exemple que l'on donne toujours : en mathématique le carré est bien un rectangle particulier, mais pas en C++.

  8. #8
    Membre régulier Avatar de inddzen
    Inscrit en
    Avril 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2004
    Messages : 133
    Points : 81
    Points
    81
    Par défaut
    C'est bon, vous m'avez donne la honte
    Dire que je programme depuis des annees....
    Mais merci quand meme, d'avoir pris le temps de repondre

  9. #9
    Membre régulier Avatar de inddzen
    Inscrit en
    Avril 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2004
    Messages : 133
    Points : 81
    Points
    81
    Par défaut
    Encore une question avant d'aller noyer ma honte dans le triangle des bermudes

    Y a t'il un moyen de savoir laquelle des classes a ete retournee dans la fonction appelante, sans devoir ajouter un attribut qui recevrais un num selon la classe initialisee??

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu peux faire un test avec dynamic_cast pour savoir si le type dynamique de ton A* est en fait B ou C. Mais bon d'un point de vue conception c'est pas très rigoureux. En général lorsqu'on construit une hiérarchie polymorphique c'est justement pour pouvoir manipuler des B, C, D, ... sous forme de A* via des fonctions virtuelles.

    http://c.developpez.com/faq/cpp/?pag...RS_downcasting

  11. #11
    Membre régulier Avatar de inddzen
    Inscrit en
    Avril 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2004
    Messages : 133
    Points : 81
    Points
    81
    Par défaut

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    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 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Citation Envoyé par Laurent Gomila
    [..carrés et rectangles...]
    Il me semble que c'est justement le contre-exemple que l'on donne toujours : en mathématique le carré est bien un rectangle particulier, mais pas en C++.
    Tout à fait. Mais ne te restreins pas au C++. C'est valable dans les autres langages OO.
    Cf les articles, de Robert C. Martin (je crois), sur Object Mentor qui traitent du LSP.

    Dans le même genre, on ne dérive pas publiquement une liste triée d'une liste.

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

Discussions similaires

  1. Méthode/ fonction avec un String comme "return"
    Par foggiat dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 16/11/2014, 03h02
  2. Fonction avec return table
    Par Aethia dans le forum Sybase
    Réponses: 6
    Dernier message: 11/12/2013, 19h39
  3. tester si fonction avec return a été exécutée
    Par santaflam dans le forum Général Python
    Réponses: 30
    Dernier message: 09/08/2011, 20h11
  4. Fonction avec un return
    Par baleiney dans le forum Langage
    Réponses: 2
    Dernier message: 04/01/2008, 00h27
  5. Fonction avec 4 paramètres, c'est possible ?
    Par arnaudperfect dans le forum Langage
    Réponses: 2
    Dernier message: 18/06/2007, 10h31

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