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 :

Pointeurs de membre


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut Pointeurs de membre
    Bonjour à tous,

    Tout comme les pointeurs de fonction, je tente d'utiliser des pointeurs de membres :

    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
     
    template<class T>
    class CGes
    {
    public:
        typedef typename int* T::*TDataProperty;
        int* GetData(T& tData, TDataProperty prop) { return tData.*prop; }
    };
     
    class CMaClass
    {
    public:
       int m_i;
    };
     
    CMaClass obj;
    obj.m_i = 4; // Pour le test
     
    CGes<CMaClass>::TDataProperty prop = &CMaClass.m_i;
     
    CGes testGes;
    int i = testGes.GetData(obj, prop);
    Et en fait, lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int* i = obj.*prop;
    Ca me renvoi une adresse mémoire proche de zéro (0x00000016). J'imagine qu'il faut additionner l'adresse renvoyé par "obj.*prop" à l'adresse de "&obj" ?

    Que dois-je modifier dans mon code pour que ça soit correct ?


    Merci beaucoup,

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Ton code est truffé d'erreurs. Je me demande même comment tu as pu le compiler.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef typename int* T::*TDataProperty;
    L'emploi du mot clé typename est incorrect.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CGes<CMaClass>::TDataProperty prop = &CMaClass.m_i;
    C'est &CMaClass::m_i et non &CMaClass.m_i.
    Tu initialises int* CMaClass::* avec un int CMaClass::*. Ça ne doit pas compiler.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int i = testGes.GetData(obj, prop);
    Cette ligne est également fausse mais c'est dû aux erreurs précédentes.

    Je n'ai pas l'impression que tu aies compris comment on se sert d'un pointeur sur membre.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Oui effectivement c'est la première fois que j'utilise des pointeurs de membres.

    J'ai corrigé et ça fonctionne bien.


    Merci beaucoup
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci,


    Et est-ce que c'est possible, à partir d'un pointeur de membre, de retrouver l'offset de ce membre dans la classe ?

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par mister3957 Voir le message
    Merci,


    Et est-ce que c'est possible, à partir d'un pointeur de membre, de retrouver l'offset de ce membre dans la classe ?

    A bientôt
    Non, je ne pense pas que cela soit possible (même si effectivement un pointeur sur membre n'est en réalité qu'un offset) mais tu peux utiliser la macro offsetof pour obtenir l'offset d'un membre.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
    #include <cstddef> //pour offsetof
     
    struct A {
      int i, j;
    };
     
    int main() {
      std::cout << offsetof(A, j) << std::endl;
      return 0;
    }
    Donne 4 sur ma machine.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci, c'est ce que j'étais en train de regarder et ça fonctionne bien.

    Je suis en train de regarder comment encapsuler cette fonction dans une structure pour faire de la méta programmation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template <class TClass, class TType, TType (TClass::*mem)>
    struct MemOffset
    {
       enum { value = offsetof(*mem) };
    };
    Le compilateur me fait une erreur
    error C2057: expression constante attendue
    Donc j'ai décomposé la fonction, essayé plein de trucs, mais rien à faire :'(
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

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

Discussions similaires

  1. Problème de pointeur null membre de classe
    Par nanotech111 dans le forum Langage
    Réponses: 7
    Dernier message: 17/10/2011, 10h29
  2. Réponses: 9
    Dernier message: 27/11/2008, 18h38
  3. Pointeurs sur membres d'un conteneur
    Par Progs dans le forum C++
    Réponses: 29
    Dernier message: 12/02/2006, 18h29
  4. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  5. pointeur membre static de classe
    Par Ca$ul dans le forum C++
    Réponses: 3
    Dernier message: 26/08/2004, 13h02

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