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 :

Passge par référence & héritage


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Passge par référence & héritage
    Bonjour à tous,
    je veux combiner le passage par référence et la notion d'héritage dans mon code,
    la méthode Get de la classe test de mon code de test possède deux paramètres dont le deuxième est passé par référence, sauf que je ne veux pas faire de casting lors de l’appel à cette méthode,
    je veux faire directement Get(1,ptr); au lieu de Get(1,(ab*&)ptr);
    voici mon code, y'a t'il une solution svp
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    class ab
    {
    };
    class a:public ab
    {
    	int x;
    public:
    	void Seta(int val){x=val;};
    };
    class b:public ab
    {
    	int x;
    public:
    	void Setb(int val){x=val;};
    };
    class test
    {
    	a pa;
    	b pb;
    public:
    	void Get(int type,  ab* & ptr)
    	{
    		if(type==1)
    			ptr=&pa;
    		else
    			ptr=&pb;
    	};
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
        test t;
    	a *ptr=NULL;
    	t.Get(1,(ab*&)ptr);//t.Get(1,ptr);
    	return 0;
    }

  2. #2
    Membre régulier Avatar de Blowih
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    pourquoi pas simplement ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class test
    {
       a pa;
       b pb;
    public:
       void Get(int type,  ab* ptr)
       {
          if(type==1)
             ptr=&pa;
          else
             ptr=&pb;
       };
    };

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    parce que dans ce cas, je trouve ptr NULL après avoir appeler la méthode t.Get(1,ptr);

  4. #4
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Get(int type,  ab* & ptr)
    est correct, mais il attend une référence sur un pointeur sur AB. Or tu lui passes un pointeur sur A, qu'il faut donc caster "de force"...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void main()
    {
        test t;
        ab*  ptr;
        t.Get(1,ptr);
    }
    Par contre, ce code là marche, et c'est "conceptuellement" correct, puisque ton Get retourne soit un "a", soit un "b", et tu le stockes dans un "ab" (la classe de base).


    Mais sinon pourquoi un Get qui peut retourner les 2 ?
    Pourquoi pas tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void  Get(a*& ptr) { ptr = &pa; }
    void  Get(b*& ptr) { ptr = &pb; }
     
    et tu pourras faire
     
        a*  p1;
        b*  p2;
     
        t.Get(p1);
        t.Get(p2);
    ?

  5. #5
    Membre régulier Avatar de Blowih
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    Citation Envoyé par bigquick
    Et sinon pourquoi un Get qui peut retourner les 2 ?
    Pourquoi pas tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void  Get(a*& ptr) { ptr = &pa; }
    void  Get(b*& ptr) { ptr = &pb; }
     
    et tu pourras faire
     
        a*  p1;
        b*  p2;
     
        t.Get(p1);
        t.Get(p2);
    ?
    +1

  6. #6
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Mais ce que je veux moi c’est faire passer le paramétre ptr par référence pour que je puisse le modifier, et puisque le compilateur accepte le passage sans référence comme dans ce cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void Get(int type,  ab* ptr)
    	{
    		if(type==1)
    			ptr=&pa;
    		else
    			ptr=&pb;
    	};
    :, normalement il doit accepter aussi le passage par référence comme dans ce cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void Get(int type,  ab* & ptr)
    	{
    		if(type==1)
    			ptr=&pa;
    		else
    			ptr=&pb;
    	};
    et je vois pas pourquoi il refuse ça :

  7. #7
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Euh, relis les posts au dessus, normalement c'est expliqué
    Ou alors on a toujours pas compris ...

    En gros, le compilateur accepterait volontiers le passage par référence, mais le type du pointeur que tu lui passe ne correpond pas !

    ... et je reste convaincu que c'est bizarre d'avoir un get qui ne retourne pas toujours le même type... ou alors c'est que tu veux récupérer ça avec un pointeur de la classe de base (ab*), et ça ca marchera.

  8. #8
    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 je vois pas pourquoi il refuse ça
    Parce que les conversions implicites ne fonctionnent pas dans le cas de passage par référence non constante (puisque ce serait un temporaire qui serait passé et non l'objet original). Or toi tu essayes de passer un a* par référence là où on attend un ab*. Sans référence cela compile car a dérive de ab ; la conversion de a* en ab* est donc effectuée implicitement.

    Je pense aussi que tu voulais passer un ab*, car ça ne rimerait à rien de mettre un b* dans un a* (ce que peut faire ta fonction)...

  9. #9
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Oups désolé pour mon 1er post qui a du paraitre bizarre, je me suis mélangé les pinceaux entre les classes A et AB (d'où le speech sur la fonction spécifique à ab). Je m'embrouille un peu quand ce n'est pas très concret

  10. #10
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    merci pour cette explication, je voulai simplement éviter de faire la surcharge de la fonction Get comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void Get(a* ptr);
    void Get(b* ptr);
    mais je pense que c’est la seule solution.

  11. #11
    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
    Pas la seule, mais nettement la meilleure. Faire un accesseur pour deux données membres, c'est incohérent.
    D'ailleurs tu ne devrais pas nommer tes deux accesseurs de la même manière, essaye un GetA et un GetB -- ce sera bien plus explicite.

  12. #12
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    merci encore à tous et a+.

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

Discussions similaires

  1. retour d'objet par référence...
    Par sas dans le forum C++
    Réponses: 15
    Dernier message: 28/05/2005, 18h54
  2. Réponses: 3
    Dernier message: 19/05/2005, 11h46
  3. [JACOB] Comment passer un objet par référence à une méthode
    Par zlavock dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 21/03/2005, 19h28
  4. Réponses: 10
    Dernier message: 03/03/2005, 14h36
  5. Passage d'un tableau par référence?
    Par sebduth dans le forum C
    Réponses: 9
    Dernier message: 16/07/2003, 19h32

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