#include <windows.h>
#include <iostream>
#include <time.h>
using namespace std;
// declaramos que existe uma classe com esse nome
class FuzzyCall;
// ponteiro para métodos da classe acima
typedef void (FuzzyCall::*FP_Fuzzy)();
/** Classe que faz chama um método aleatório. */
class FuzzyCall
{
public:
FuzzyCall()
{
srand(GetTickCount()); // chacoalha o saco de bingo
}
FP_Fuzzy GiveMeAMethod() { return m_methods[rand() % 3]; }
private:
void MethodOne() { cout << "One!n"; }
void MethodTwo() { cout << "Two!n"; }
void MethodThree() { cout << "Three!n"; }
static FP_Fuzzy m_methods[3];
};
/** Array com os métodos que podem ser chamados aleatoriamente. */
FP_Fuzzy FuzzyCall::m_methods[3] = { &MethodOne, &MethodTwo, &MethodThree };
/** Recebe um ponteiro para um método de FuzzyCall e chama com um objeto local. */
void passThrough(FP_Fuzzy pMethod)
{
FuzzyCall fuzzyObject; // esse é o objeto local
( fuzzyObject.*pMethod )(); // essa é a chamada
}
/** No princípio Deus disse: 'int main!'
*/
int main()
{
FuzzyCall fuzzyObject1;
FP_Fuzzy pMethod;
// pegamos um método da classe qualquer
pMethod = fuzzyObject1.GiveMeAMethod();
// e passamos para uma outra função
passThrough(pMethod);
}error C4867: 'FuzzyCall::MethodOne': function call missing argument list;
use '&FuzzyCall::MethodOne' to create a pointer to memberFuzzyCall fuzzyObject; // esse é o objeto local
FuzzyCall* pFuzzy = &fuzzyObject; // ponteiro para esse mesmo objeto
( fuzzyObject.*pMethod )(); // [objeto] .* [ponteiro de método]
( fuzzyObject->*pMethod )(); // [ponteiro para objeto] ->* [ponteiro de método]

Opinião do leitor:
Peixe Grande 2008
Galaxy 7 - O Smartphone da Asus
© 2005 - 2008 - Oficina da Net - v 3.0 - É proibida a reprodução parcial ou completa do conteúdo deste site sem autorização por escrito. Resolução adequada: 1024x768px.