2010-05-06 4 views
7

J'ai lu sur les pointeurs aux membres de la classe, mais je n'ai jamais vu les utiliser dans des applications pratiques. Quelqu'un peut-il expliquer quels sont les cas d'utilisation de ces indicateurs? Est-il vraiment nécessaire d'avoir de tels indicateurs?À quoi servent les pointeurs pour les membres de la classe?

Par exemple.

class abc 
{ 
public: 
    int a; 
    abc(int val) { a = val; } 
}; 

int main() 
{ 
    int abc::*data; 
    abc obj(5); 

    data = &abc::a; 

    cout << "Value of a is " << obj.*data << endl; 

    return 0; 
} 

Dans l'exemple ci-dessus. pourquoi la valeur de 'a' est-elle accessible de cette manière? Quel est l'avantage d'utiliser des pointeurs pour les membres de la classe?

Répondre

9

Le plus grand avantage d'un pointeur à membre ou membre à pointeur fonction est que vous

  • ne pas avoir à se lier à une instance spécifique tout de suite
  • ne ont pas besoin Pour placer des restrictions sur les noms des membres, seul le type doit correspondre.

Ceci peut être utilisé par relances ou algorithmes abstraits:

std::map<int,int> m; 
m.insert(std::make_pair(1,2)); 
m.insert(std::make_pair(3,4)); 
m.insert(std::make_pair(5,6)); 
std::ptrdiff_t s = 
    std::count_if(m.begin(), m.end(), 
        boost::bind(&std::map<int,int>::value_type::first, _1) > 2); 
std::cout << s << std::endl; // 2 

Notez que Boost.Bind, Boost.Function et leurs équivalents TR1 encapsulent déjà bien pour vous. Dans une certaine mesure, la norme actuelle comprend également des outils tels que std::mem_fun en <functional>.

+0

'std :: mem_fun()' et al. compter sur pointeur à membre. – wilhelmtell

+0

Oui, mais ils encapsulent l'utilisation - j'ai rarement besoin de déclarer des pointeurs à un membre pendant un certain temps maintenant. –

+0

Pour la clarté de la démonstration, j'aurais probablement utilisé le 'map :: operator []': la combinaison 'insert' et' make_pair' est tellement verbeuse: p Bonne réponse merci :) –

2

Si vous avez utilisé MFC, vous verrez des pointeurs vers concept de fonction membre est fortement utilisé (interne)

DECLARE_MESSAGE_MAP, BEGIN_MESSAGE_MAP, END_MESSAGE_MAP Voir Message Maps

0

La question que je suppose est: « qu'est-ce que le pointeur aux données de membre ajouter le pointeur simple aux données? et la seule réponse que je peux penser est un niveau de signification explicite: nous pointons sur des données dans cette classe.

Maintenant, je peux voir une certaine valeur dans ce qui est effectivement une documentation supplémentaire de l'intention. Un exemple que j'ai vu qui pourrait être assez puissant est quand notre «classe» est en fait une structure C héritée. Maintenant, nous n'avons pas de méthodes locales de cette structure, donc avoir des pointeurs qui sont explicitement associés à cette structure peut rendre notre code plus clair.

+1

Si vous spécifiez l'instance de classe et la variable, vous avez un pointeur normal (l'adresse est complètement spécifiée). C'est quand vous spécifiez la variable mais pas l'instance de classe que vous obtenez un pointeur vers membre, qui est à peu près juste le décalage depuis le début de l'instance à l'endroit où cette variable est stockée. C'est assez d'information pour aller et accéder à la variable dans n'importe quelle instance de la classe. –

0

pointeur à membre est, comme toutes les fonctionnalités C++, juste du sucre syntaxique pour quelque chose que vous pourriez avoir déjà fait dans le plus pur C.

Pointeurs-à-membre variable sont assez simples. Un cas d'utilisation est si vous vouliez écrire une fonction (modèle) qui pourrait trier un tableau de structures par n'importe quel champ. En passant un pointeur vers un membre, vous pouvez récupérer un champ spécifié de n'importe quelle instance de la structure sans avoir à coder le champ en dur. Bien sûr, un foncteur qui accepte un pointeur de structure et renvoie la valeur du champ aurait pu être utilisé à la place.

Les pointeurs vers la fonction de membre sont un peu plus compliqués. À première vue, ils sont comme des pointeurs de fonction ordinaires qui savent comment passer le pointeur caché «this». Mais les fonctions virtuelles rendent une idée simple plutôt compliquée.

Et les classes de base virtuelles rendent terriblement complexes tous les pointeurs vers les membres. Ce n'est pas quelque chose que vous voudriez coder en utilisant des constructions C simples. Mais les cas complexes sont rares.

Questions connexes