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 :

uninitialized reference member


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Points : 72
    Points
    72
    Par défaut uninitialized reference member
    Bonjour , j'ai qq problèmes à appliquer certaines notions vu au cours ,
    imaginons une classe A et B . B doit avoir une variable membre qui fait référence à la classe A.

    a.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class B;
     
    class A
    {
       //...
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "a.h"
    class B
    {
    	//...
    	private:
    		A&		refA;
     
    };
    J'obtiens cette erreur à la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uninitialized reference member ‘B::refA’
    Je sais qu'une référence ne peut être initialisée à NULL , contrairement à un pointeur mais il est stipulé dans l'exercice que l'on doit utiliser les références.

    ma question est donc la suivante : Comment initialiser ?

    Merci d'avance pour votre aide

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    B::B(A& obj):refA(obj)
    {
     
    }

  3. #3
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Points : 72
    Points
    72
    Par défaut
    Merci de votre réponse ,

    je rajoute donc le constructeur suivant dans la classe B: (b.h)

    avec la ligne que vous m'avez donnée dans le b.cpp pour initialiser , et j'obtiens toujours la même erreur . J'ai loupé quoi ?

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Tu as bien l'initialisation de la référence dans la liste d'initialisation du constructeur ?

  5. #5
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Points : 72
    Points
    72
    Par défaut
    Voici mes 3 fichiers , ce sera plus clair :

    a.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class B;
     
    class A
    {
    //...
    };
    b.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "b.h"
     
    B::B(A& obj):refA(obj)
    {
     
    }
    b.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "a.h"
     
    class B
    {
     //...
    private:
            A& refA;
    };

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Euh la pour moi le code est bon.
    Je ne vois pas pourquoi il te sort ça.

    Donne donc le code complet de ta classe B ou tout du moins ses constructeurs.

  7. #7
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Points : 72
    Points
    72
    Par défaut
    Ce n'est rien de bien développé , c'est une classe de test ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class B
    {
         public:
    		B() {};
    		B(Equipage&);
    		~B() {};
     
          private:
                   A&   refA;
    };
    Merci de votre aide

  8. #8
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Points : 72
    Points
    72
    Par défaut
    Je ne sais pas si ca apporte qq chose mais tant qu'a faire :

    voilà b.cpp au complet

    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
     
     
    #include "b.h"
     
    B :: std::ostream& operator<<(std::ostream& s,const B& v)
    {
    //...
    }
     
    B::B(A& obj):refA(obj)
    {
    //...
    }
     
    B :: std::istream& operator<<(std::istream& s,B& v)
    {
    //...
    }
    b.h
    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 B
    {
              friend ostream& operator<<(std::ostream& ,const B&  );
              friend istream& operator>>(std::istream& ,B& );
     
    	public:
    		B() {};
    		B(A&);
    		~B() {};
     
    	private:
    		A&		refA;
    };
    Dans b.cpp j'ai des erreurs assez étranges au définitions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     error: ‘class B::std’ has not been declared
    c'est à cause du B:: std::ostream je me doute donc je dois plutot utiliser std::ostream pour remplacer par B :: ostream et cela fonctionne mais il n'y a pas une autre methode ?

    Sinon une autre erreur persiste que ce soit sur la définition de l'ostream ou de l'istream , il s'agit de celle - ci , et j'avoue bloquer dessus depuis pas mal de temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    expected constructor, destructor, or type conversion before ‘&’ token
    J'obtiens cette derniere erreur sur les lignes suivantes donc : ( std::ostream ou ostream , peu importe )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    B :: std::ostream& operator<<(std::ostream& s,const B& v) // <-
    {//...}
     
    B :: std::istream& operator<<(std::istream& s,B& v) // <-
    {//...}
    Je remercie d'avance quiquonque pourrait me mettre sur la voie

    Bonne nuit

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Salut,

    dans un .cpp, le type de retour des fonctions s'écrit avant le nom de la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    std::ostream& B::operator<<(std::ostream& s,const B& v)
    {
    //...
    }
     
    std::istream& B::operator>>(std::istream& s,B& v)
    {
    //...
    }
    Secundo, lorsque tu écris des méthodes friends dans le .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
              friend ostream& operator<<(std::ostream& ,const B&  );
              friend istream& operator>>(std::istream& ,B& );
    Et bien elle ne sont pas membres de l'objet B, il ne faut donc pas écrire B:: devant operator<<

    Regarde bien l'exemple d'amitié dans la faq : http://cpp.developpez.com/faq/cpp/?p...RIEND_avantage

  10. #10
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Points : 72
    Points
    72
    Par défaut
    Merci beaucoup , problème reglé à ce niveau là !
    Néanmoins au niveau de la référence cela ne fonctionne toujours pas , je continue mes recherches

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bonjour
    Citation Envoyé par Leole Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class B
    {
         public:
    		B() {};
    		B(Equipage&);
    		~B() {};
    
          private:
                   A&   refA;
    };
    Tu as un problème avec ce constructeur, il n'initialise pas refA.

    Enlève le ou met le en private avec
    B() : refA(NULL) {} qui ne etre jamais appeler.
    rajoute explicite devant le createur par defaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class B
    {
         public:
    		
    		explicite B(Equipage&);
    		~B() {};
    
          private:
    B() : refA(NULL) {};//je ne sais si c'est correcte
                   A&   refA;
    
    };

  12. #12
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    J'imagine que dans ton main ou quelque part, tu instancies un objet B. J'imagine aussi que tu appelles son constructeur par défaut (que tu devrais avoir tout simplement retiré de la classe B) alors que tu devrais appeler le constructeur qui prend un objet A en paramètre.

  13. #13
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Points : 72
    Points
    72
    Par défaut
    Bonjour , merci pour vos réponses ,

    alors j'ai mis effectivement le mot clé 'explicit' devant le constructeur B(Equipage&);

    et j'ai supprimé le constructeur par défaut.

    J'ai fais une recherche du mot "explicit" sur le forum , mais rien de bien convainquant , pouvez-vous m'en dire plus sur les mécanismes qu'il y a derriere ?

    merci à vous

    edit: cela fonctionne

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Le mot-clé explicit sert à empêcher la conversion implicite du paramètre en objet.
    En C++, tout constructeur est implicite par défaut, et je pense que c'est une erreur.

    Plus d'infos ici (en anglais) : Beware the C++ implicit conversion

  15. #15
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Points : 72
    Points
    72
    Par défaut
    Merci beaucoup , très interessant comme page !

    je mets le sujet en résolu

  16. #16
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le mot-clé explicit sert à empêcher la conversion implicite du paramètre en objet.
    En C++, tout constructeur est implicite par défaut, et je pense que c'est une erreur.

    Plus d'infos ici (en anglais) : Beware the C++ implicit conversion
    J'imagine que si le constructeur par copie n'était pas implicite par defaut, on ne pourrait alors pas retourner des objets par valeur.

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

Discussions similaires

  1. winsock.h : undefined reference...
    Par abraxas dans le forum Dev-C++
    Réponses: 14
    Dernier message: 06/08/2012, 13h42
  2. Réponses: 3
    Dernier message: 11/06/2012, 09h36
  3. Réponses: 8
    Dernier message: 16/01/2007, 11h16
  4. Réponses: 4
    Dernier message: 30/05/2006, 19h39
  5. [VB6]Passage par référence d'une prop. d'objet à une fct
    Par -gYs- dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 02/09/2002, 08h55

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