Cuando usted tiene un puntero normal (a un objeto o un tipo básico), se utiliza para eliminar la referencia *
:
int a;
int* b = a;
*b = 5; // we use *b to dereference b, to access the thing it points to
Conceptualmente, estamos haciendo lo mismo con un miembro indicador de función:
class SomeClass
{
public: void func() {}
};
// typedefs make function pointers much easier.
// this is a pointer to a member function of SomeClass, which takes no parameters and returns void
typedef void (SomeClass::*memfunc)();
memfunc myPointer = &SomeClass::func;
SomeClass foo;
// to call func(), we could do:
foo.func();
// to call func() using our pointer, we need to dereference the pointer:
foo.*myPointer();
// this is conceptually just: foo . *myPointer ();
// likewise with a pointer to the object itself:
SomeClass* p = new SomeClass;
// normal call func()
p->func();
// calling func() by dereferencing our pointer:
p->*myPointer();
// this is conceptually just: p -> *myPointer ();
Espero que esto ayude a explicar el concepto. Estamos efectivamente desreferenciando nuestro puntero a la función miembro. Es un poco más complicado que eso: no es un puntero absoluto a una función en la memoria, sino solo un desplazamiento, que se aplica a foo
o p
arriba. Pero conceptualmente, estamos desreferenciando, al igual que eliminaríamos un puntero de objeto normal.
Creo que [estas preguntas frecuentes] (http://www.parashift.com/c++faq-lite/pointers-to-members.html) lo explica bastante bien. –
@Rob: No puedo creer que haya publicado el enlace equivocado. ¡X___X es el que quería publicar, no MSDN! - Lo he visto, pero no entendí mucho de eso. Todo lo que dicen es que "el tipo es diferente", pero encontré ese tipo de confusión ... – Mehrdad