Указатель на функцию-член класса как член класса - PullRequest
3 голосов
/ 21 декабря 2011
// class
class MyClass
{
public:
void doIt() const
{
    cout << "It works!" << endl;
}

void(MyClass::*fPtr)() const;
};

// main

MyClass *t = new MyClass;

// store function address
t->fPtr = &MyClass::doIt;

(*(t->fPtr))(); // Whats wrong with this line?

Как я могу вызвать функцию, хранящуюся в fPtr?когда я пытаюсь (* (t-> fPtr)) ();компилятор выдает эти ошибки:

ошибка C2171: '*': недопустимо для операндов типа 'void (__thiscall MyClass :: *) (void) const

ошибка C2064: термин не оценивается какфункция, принимающая 0 аргументов

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

(*(t->fPtr))(); неверно, правильный синтаксис - ((object)->*(ptrToMember))

означает

(t->*(t->fPtr))();

Более подробная информация здесь: http://www.parashift.com/c++-faq-lite/pointers-to-members.html (Но лучше игнорируйте эти макросы с этой страницы ..)

2 голосов
/ 21 декабря 2011

В области действия main() нет переменной с именем fPtr. Вам необходимо обратиться к переменной-члену с помощью оператора ->, а затем разыменовать указатель на член с помощью ->*:

// main

MyClass *t = new MyClass;

// store function adress
t->fPtr = &MyClass::doIt;   

(t->*(t->fPtr))();

В качестве альтернативы вы можете создать локальную переменную и присвоить ей указатель на член:

// main

MyClass *t = new MyClass;

// store function adress
t->fPtr = &MyClass::doIt;

void (MyClass::*fp)() const = t->fPtr;
(t->*fp)();

Последнее проясняет, зачем нужна странная конструкция выше. Вы также можете выполнить метод для объекта, отличного от того, для которого вы используете переменную-член типа указатель на член:

MyClass *s = new MyClass;
MyClass *t = new MyClass;

s->fPtr = &MyClass::f;
t->fPtr = &MyClass::g;

(t->*(s->fPtr))(); // Call f() on object *t
(s->*(t->fPtr))(); // Call g() on object *s

Объект слева от -> сообщает компилятору, с какого объекта считывать указатель на член, в то время как объект слева от ->* сообщает компилятору, с какого объекта вызывать функцию-член.

...