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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top