В C ++, как я могу объявить указатель функции на метод в классе? - PullRequest
0 голосов
/ 25 октября 2011

В C ++ я пытаюсь определить тип, подходящий для указателя на одну из нескольких функций-членов моего класса cBar (все функции имеют одинаковый интерфейс, например, принимают int и возвращают void).

Сейчас я делаю глобальный тип tHandler, подходящий для указателя на одну из нескольких глобальных функций, принимающий дополнительный параметр me, содержащий указатель на мой класс cBar, следующим образом:

typedef void(*tHandler)(class cBar *const me, int val);

void Handler0(class cBar *const me, int val);
void Handler1(class cBar *const me, int val);

class cBar {
    tHandler fCurrentHandler;
    /*..*/
public:
    inline void cBar::CurrentHandler(int val) {
        (*fCurrentHandler)(this,val);
        }
    inline cBar() {
        fCurrentHandler = Handler0;
        CurrentHandler(0);
        }
    inline ~cBar() {
        CurrentHandler(-1);
        }
    };

Это безобразно;в частности Handler0 и Handler1 должны быть закрытыми методами cBar, а tHandler должен быть закрытым типом.

Любая подсказка?ТИА.

1 Ответ

4 голосов
/ 25 октября 2011

Указатель на член может быть объявлен как

typedef void(Trustee::*tHandler)(int);

Вот как это использовать (адаптация собственного кода):

class Trustee {
    typedef void(Trustee::*handler_t)(int);
    handler_t pfCurrentHandler;
    void handlerOne(int i) { cout << "HandlerOne: " << i << endl; } 
    void handlerTwo(int i) { cout << "HandlerTwo: " << i << endl; } 
public:
    void CurrentHandler(int val) {
        (this->*pfCurrentHandler)(val);
    }
    Trustee() : pfCurrentHandler(&Trustee::handlerOne) {
        CurrentHandler(0);
    }
    ~Trustee() {
        CurrentHandler(-1);
    }
};

Обратите особое внимание на operator ->*, который вы не видите каждый день.

увидеть его в действии .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...