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 :

commen initialiser une référence qui est une variable d'instance?


Sujet :

C++

  1. #1
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut commen initialiser une référence qui est une variable d'instance?
    Bonjour,

    Je souhaite créer une classe dont une variable d'instance est un tableau de 5 entiers (int tab[5]). Le dernier de ces 5 entiers a une signification bien particulière (appellons le "last" et sera accedé par les methodes de ma classe beaucoup plus souvent que les autres. Pour que mon code soit plus clair, je souhaite utiliser la variable "last" plutot que "tab[4]" pour acceder à cet entier.
    Mais last, C'EST tab[4], j'ai donc pensé à utiliser une référence. Seulement je ne sais pas comment l'initialiser:
    Si je réduit le code au minimum:
    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
    class A
    {
    private:
      int tab[5];
      int& last;
    public:
      A();
    };
     
    A::A()
    {
      last = tab[4];
    }
     
    int main(void)
    {
     return 0;
    }
    message d'erreur:
    error C2758: 'A::last' : must be initialized in constructor base/member initializer list
    Ou dois-je initialiser "last"?
    Ou: est-ce une mauvaise idée d'utiliser une référence? et dams ce cas que faire à la place?

    merci

  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
    Liste d'initialisation :
    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
    #include <iostream>
     
    class A
    {
    private:
      int tab[5];
      int & last;
    public:
      A();
    };
     
    A::A() : last(this->tab[4])
    {
     
    }
     
    int main(void)
    {
     return 0;
    }
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Il faut implémenter ton constructeur en utilisant une liste d'intialisation (comme le dit le compilo ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A::A():last(tab[4])
    {}
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    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
    Ou dois-je initialiser "last"?
    Comme le dit le compilo : dans la liste d'initialisations.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A::A() :
    last(tab[4])
    {
     
    }

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Davidbrcz
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    A::A() : last(tab)
    {
     
    }
    Non, là last va pointer directement sur tab.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  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
    Je m'en suis rendu compte , j'ai édité.
    Ja vais mal lu le message au dessue du code et je ne métait concentré que sur le code.
    Honte a moi.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut

    Quelle rapidité!
    3 messages postés à 2 minutes d'intervalle

    Et en plus ça marche (vous n'en doutiez pas)

    merci à tous les trois!

    (pour le classement de la course je suis obligé de mettre r0d en premier, puisque Davidbrcz a du éditer son post. C'est donc r0d qui gagne une tringle à rideaux! on l'applaudit bien fort)

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/03/2011, 13h36
  2. lien vers une page qui est une frame
    Par laurentSc dans le forum Balisage (X)HTML et validation W3C
    Réponses: 22
    Dernier message: 10/03/2011, 17h32
  3. Réponses: 3
    Dernier message: 06/12/2010, 15h59
  4. Réponses: 0
    Dernier message: 04/08/2010, 14h02
  5. Réponses: 7
    Dernier message: 28/01/2007, 11h38

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