2011-12-21 5 views
3
// 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: '*': недопустимый операндов типа «пустоте (__thiscall MyClass :: *) (аннулируются) Const

ошибка C2064: термин не вычисляться в функции принятия 0 аргументов

+4

'(т -> * (t-> fPtr))() 'Я думаю, должен работать – KoKuToru

+0

@KoKuToru: Это неправильно. – Nawaz

+0

@ Наваз работает, я тестировал его. – KoKuToru

ответ

2

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

средства

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

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

2

В функции 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 

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