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 :

initialisation reference membre dans constructeur


Sujet :

C++

  1. #1
    Membre habitué Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Points : 193
    Points
    193
    Par défaut initialisation reference membre dans constructeur
    Bonjour,

    Parmis les variable membre d'un objet se trouve une reference sur un autre objet. Pour initialiser celle ci, je passe en parametre de mon constructeur une reference sur une instance de meme type pour faire une simple affectation de ma reference membre.... et la "'CCImg::img' : doit être initialisé(e) dans la liste des initialiseurs base/membre du constructeur
    "

    je vous donne kelke ligne pour eclaircir mes betises:
    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
    class CCImg
    {
    ...
    public: 
    IplImage &img;
    ...
    };
     
     
    CCImg::CCImg (IplImage &img, ...)
    {
    this->img = img;
    ...
    }
    
    ke dois je faire pour reparer mon erreur... et surtout PKOI?

    Merci
    Avant de poser une question, lire la Avant de répondre, lire la question

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Tu as fait un MULTI POST, j'ai contacté Hdd34 pour qu'il arrange ça... fait plus attention à l'avenir s'il te plaît

    pour ton problème, il te faut à tout prix utiliser la chaîne d'initialisation du constructeur (c'est d'ailleurs ce qui devrait êtr utiliser tout le temps ou presque : http://c.developpez.com/faq/cpp/?pag...EUR_liste_init )

    remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CCImg::CCImg (IplImage &img, ...)
    {
    this->img = img;
    ...
    }
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CCImg::CCImg (IplImage &Img, ...) : img(Img)
    {
    ...
    }
    d'ailleurs je te conseillerais d'utiliser des conventions de codage qui te permettront de ne jamais avoir un paramètre et une donnée membre qui ait le même nom... perso je fais toujours commencer les nom des données membres par un _ ça permet de les identifier sans ambigüité tout au long du code (même si j'utilise tout le temps this-> également on repère vachement mieux, puis ça aère le code ^^ )

    le problème vient du fait que les références _DOIVENT_ être assignées avec leur constructeur, si c'est l'opérateur = qui est utilisé, alors c'est une copie qui est faite, et comme tu n'as pas assigné la référence en question, elle ne pointe sur aucune variables => GROS PROBLEME
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Pas mieux
    Multipost réglé.

  4. #4
    Membre habitué Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Points : 193
    Points
    193
    Par défaut
    Merci pour la reponse, j avais ete voire du cote des listes d initialisation sur la faq sans tout saisir (me suis pas non plus trop attardé), j y retourne.

    Pour le multi post ki n'en etait pas un (les posts etaient un poil differents), j'ai just edité plusieurs fois mon post pour rajouter les balises de codes (comme je l ai deja fait dans le passé), je ne comprend pas pkoi ce resultat...

    Merci
    Avant de poser une question, lire la Avant de répondre, lire la question

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    OK Merci Miles (et désolé Hdd34 si tu lis ça ^^)

    Les listes d'initialisations permettent d'appeller directement le constructeur des données membres (et de la classe mère en cas d'héritage)

    ça évite d'appeller le constructeur de copie PUIS l'opérateur d'affectation, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CLASS::CLASS(const Obj& O) : _O(O) { }
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Obj _O(O);
    // ou (les deux sont strictement équivalent
    Obj _O = O;
    tandis que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CLASS::CLASS(const Obj& O) { this->_O = O; }
    est équivalent à si Obj est une "grosse" classe, ça va entrainer de (très) nombreuses opérations supplémentaires...
    puisqu'il faudra
    1°) Appeller le constructeur par défaut
    2°) Faire une copie de O dans _O

    alors qu'avec la liste d'initialisation, seul le constructeur par copie est appelé...

    de plus, c'est le seul moyen de définir les constantes et de faire pointer les références (comme tu t'en es rendu compte ^^)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/01/2015, 22h41
  2. Initialisation de membre finaux dans le bon sens ?
    Par BakaOnigiri dans le forum Langage
    Réponses: 2
    Dernier message: 11/12/2009, 09h33
  3. Réponses: 9
    Dernier message: 05/11/2008, 21h26
  4. Réponses: 35
    Dernier message: 14/02/2006, 18h57
  5. Réponses: 4
    Dernier message: 29/07/2005, 11h47

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