2009-09-22 3 views
2

Я немного поболтал, чтобы узнать, как это сделать, и я думаю, что я делаю это правильно ... Моя цель - иметь массив объектов структуры, содержащих указатели на функции-члены класса.C++: указатель на функцию члена класса внутри связанной структуры

Вот что я до сих пор ...

typedef void (foo::*HandlerPtr)(...); 
class foo 
{ 
public: 
    void someFunc(...); 
    // ... 
private: 
    // ... 
}; 

struct STRUCT 
{ 
    HandlerPtr handler; 
}; 

STRUCT stuff[] 
{ 
    {&foo::someFunc} 
}; 

Тогда при вызове функции с помощью (вещи [0]. * Обработчик)(), с аргументами или без них (я на самом деле намерены использовать аргумент списки), я получаю «обработчик»: необъявленный идентификатор ...

Я должен что-то упустить, просто не знаю, что.

ответ

8

SomeFunc() не является статическим методом, так что вам нужен экземпляр объекта Foo, чтобы вызвать SomeFunc() через переменную указатель на метод, то есть:

foo f; 
f.*(stuff[0].handler)(); 

Или:

foo f; 
HandlerPtr mthd = stuff[0].handler; 
f.*mthd(); 

Или, используя указатели:

foo *f = new foo; 
f->*(stuff[0].handler)(); 
delete f; 

Или:

foo *f = new foo; 
HandlerPtr mthd = stuff[0].handler; 
f->*mthd(); 
delete f;