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 :

Syntaxe : initialiser une variable membre référence


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Syntaxe : initialiser une variable membre référence
    Bonjour

    J'ai une variable membre déclarée comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LightClass &mLightFunction;
    Le constructeur de LightClass prend un objet de type Parameters :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LightClass::LightClass(Parameters params)
    Je voudrais initialiser mLightFunction dans le constructeur de la classe qui contient ce membre. Ce constructeur reçoit une référence vers un objet Parameters.

    Quelle est donc la syntaxe pour initialiser ce membre dans la liste d'initialisation du constructeur ?

    Merci.

  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 : 39
    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
    J'ai pas très bien compris ce que tu voulais affecter à quoi, mais la syntaxe dans la liste d'initialisation est la même que pour n'importe quel autre type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class C
    {
    public :
     
        C(X& x) : x_(x) {}
     
        X& x_;
    };

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Soit ton morceau de code modifié comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class C
    {
    public :
     
        C(X& x) : ???? {}
     
        Y& y_;
    };
    x est un objet à donner au constructeur de la classe Y, afin d'obtenir un objet Y, qui sera la "valeur" d'initialisation de y_.

    Que mettre à le place des points d'interrogation ?

    Merci.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Si ta classe Y est du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Y
    {
        public:
            Y(X& x):x_(x){}
            X x_;
    };
    alors, ta classe C sera, tout simplement sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class C
    {
        C(X& x):y_(x){}
    /* OU -OU - OU - OU */
        C(Y& y):y_(y){}
        Y &y_;
    };
    La première ligne utilisera le constructeur prenant un X en parametre de ta classe Y, la seconde utilisera le constructeur par copie

    [EDIT]virtules remplacée par deux points
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Hello,

    Je suppose qu'avant tes _y, tu voulais mettre un : ?

    Apparemment, la première solution ne fonctionne pas. Le compilateur ne comprend aps ça comme un argument de constructeur, mais simplement comme une valeur d'initialisation.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Bon, pour être un peu plus clair, voici mon code, expurgé.
    A la place des points d'interrogation, ce que je cherche à coder.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class AmLight
    {
        AmLight(MDagPath &dp) : ????
        ...
        MFnNonAmbientLight &mLightFunction;
    }
    
    class MFnNonAmbientLight
    {
        MFnNonAmbientLight(MDagPath &dp);
        ....
    }

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par oodini
    Hello,

    Je suppose qu'avant tes _y, tu voulais mettre un : ?

    Apparemment, la première solution ne fonctionne pas. Le compilateur ne comprend aps ça comme un argument de constructeur, mais simplement comme une valeur d'initialisation.
    Oui, de fait... la virgule et les deux points sont forts rapproché, sur mon clavier... et j'ai été un peu distrait
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  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 : 39
    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
    C'est pas logique ce que tu veux faire. Si tu souhaites construire une nouvelle donnée membre à partir du paramètre passé, alors pourquoi déclarer une référence ? Stocker une référence suppose que l'objet qui sera référencé existe déjà ailleurs, et sera donc passé en paramètre directement. Or dans ton cas tu ne veux pas pointer sur un objet qui existe déjà, mais en créer un nouveau.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Oui, effectivement. La même réflexion m'est venue pendant el déjeuner. :-)

    En fait, je pense redéclarer ma classe membre comme un pointeur, et faire un new dans la liste d'initialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AmLight::AmLight(MDagPath &dp) :
    mpLightFunction(new MFnNonAmbientLight(dp))
    L'intérêt de tout ce merdier est que j'ai besoin, dans les classes dérivées, de faire du polymorphisme sur ma variable membre.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/04/2006, 16h03
  2. comment récupérer une variable membre?
    Par marute dans le forum MFC
    Réponses: 4
    Dernier message: 13/04/2006, 16h11
  3. Réponses: 6
    Dernier message: 04/04/2006, 13h12
  4. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57
  5. Réponses: 9
    Dernier message: 29/06/2004, 08h40

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