Qual è questa tecnica C ++ per aggiungere tipi a una classe chiamata?
-
10-07-2019 - |
Domanda
Ho appena trovato del codice C ++ (su http://msdn.microsoft.com/en-us/library/k8336763(VS.71).aspx ), che utilizza una tecnica che non avevo mai visto prima per aggiungere tipi a una classe esistente:
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;
}
Qualcuno può dirmi come si chiama questa tecnica per definire i tipi derivati ??o indicarmi un po 'di documentazione su di esso? Non l'ho mai incontrato in 13 anni di utilizzo del C ++ e vorrei porre fine alla mia ignoranza.
Soluzione
Il commento non è corretto: pmfn e pmd non sono "tipi derivati" affatto (non sono nemmeno tipi!). Sono puntatori ai membri .
Altri suggerimenti
Non credo che stiano aggiungendo i tipi " alla classe. Sembra che stiano semplicemente definendo i tipi di puntatori alle funzioni e ai dati dei membri della classe, e quindi utilizzandoli per accedere alla funzione e al membro dei dati. Simile al modo in cui dichiareresti i tipi a funzioni non membro, ma essendo membri della classe la sintassi differisce.
Da questo sito qui
Per quanto riguarda la loro sintassi, ce ne sono due diversi tipi di puntatori a funzione: Da un lato ci sono puntatori a funzioni C ordinarie o C ++ statiche funzioni membro. D'altro canto ci sono puntatori a C ++ non statico funzioni membro. La differenza di base è che tutti i puntatori a non statico le funzioni membro devono essere nascoste argomento: questo puntatore a un istanza della classe. Resta sempre dentro mente: questi due tipi di funzione i puntatori sono incompatibili con ciascuno altro.