Если у вас есть обычный указатель (для объекта или базового типа), вы должны использовать *
разыменовать ему:
int a;
int* b = a;
*b = 5; // we use *b to dereference b, to access the thing it points to
Концептуально, мы делаем то же самое с членом указатель функции:
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 ();
Я надеюсь, что это поможет объяснить концепцию. Мы фактически разыскиваем наш указатель на функцию-член. Это немного сложнее, чем это - это не абсолютный указатель на функцию в памяти, а только смещение, которое применяется к foo
или p
выше. Но концептуально мы разыгрываем его, так же, как мы бы разыменовали обычный указатель объекта.
Я думаю, что [этот FAQ] (http://www.parashift.com/c++-faq-lite/pointers-to-members.html) объясняет это довольно хорошо. –
@ Rob: Не могу поверить, что я разместил неверную ссылку. X___X - это тот, который я хотел опубликовать, а не MSDN! - Я посмотрел на него, но я ничего не понял. Все, что они говорят, это то, что «тип отличается», но я нашел такое путаное ... – Mehrdad