Quelle est cette technique C ++ pour ajouter des types à une classe appelée?
-
10-07-2019 - |
Question
Je viens de trouver du code C ++ (à l'adresse http://msdn.microsoft.com/en-us/library/k8336763(VS.71).aspx ), qui utilise une technique que je n'ai jamais vue auparavant pour ajouter des types à une classe existante:
class Testpm {
public:
void m_func1() { cout << "m_func1\n"; }
int m_num;
};
// Define derived types pmfn and pmd.
// These types are pointers to members m_func1() and m_num, respectively.
void (Testpm::*pmfn)() = &Testpm::m_func1;
int Testpm::*pmd = &Testpm::m_num;
int main() {
Testpm ATestpm;
Testpm *pTestpm = new Testpm;
// Access the member function
(ATestpm.*pmfn)();
(pTestpm->*pmfn)(); // Parentheses required since * binds
// Access the member data
ATestpm.*pmd = 1;
pTestpm->*pmd = 2;
cout << ATestpm.*pmd << endl
<< pTestpm->*pmd << endl;
}
Quelqu'un peut-il me dire comment cette technique de définition des types dérivés est appelée ou m'indiquer de la documentation à ce sujet? Je n'ai jamais découvert cela en 13 ans d'utilisation de C ++ et j'aimerais mettre fin à mon ignorance.
La solution
Le commentaire est incorrect: pmfn et pmd ne sont pas des "types dérivés". du tout (ce ne sont même pas des types!). Ce sont des pointeurs vers les membres .
Autres conseils
Je ne pense pas qu'ils "ajoutent des types" à la classe. Ils semblent simplement définir des types de pointeurs sur les fonctions membres et les données membres de la classe, puis les utiliser pour accéder à la fonction membre et au membre data. Semblable à la façon dont vous déclareriez des types à des fonctions non membres, mais en tant que membres de la classe, la syntaxe est différente.
À partir de ce site ici
En ce qui concerne leur syntaxe, il y a deux différents types de pointeurs de fonction: D'une part, il y a des pointeurs vers fonctions C ordinaires ou en C ++ statique fonctions membres. D'autre part il y a des pointeurs sur le C ++ non statique fonctions membres. La différence fondamentale est-ce que tous les pointeurs non statiques les fonctions membres ont besoin d'un caché argument: le this-pointeur vers un instance de la classe. Toujours rester dans esprit: ces deux types de fonction les pointeurs sont incompatibles entre eux autre.