在 C++ 中,如何声明指向类中方法的函数指针?

发布于 2024-12-11 16:45:40 字数 880 浏览 0 评论 0原文

在 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);
        }
    };

这很难看;特别是Handler0Handler1应该是cBar的私有方法,而tHandler应该是私有类型。

有什么线索吗? TIA。

In C++, I'm trying to define a type suitable for a pointer to one of several member functions of my class cBar (all functions have the same interface, say accept an int and return void).

For now, I'm making a global type tHandler suitable for a pointer to one of several global functions accepting an additional parameter me, holding a pointer to my class cBar, as follows:

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);
        }
    };

This is ugly; in particular Handler0 and Handler1 should be private methods of cBar, and tHandler should be a private type.

Any clue? TIA.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

三五鸿雁 2024-12-18 16:45:40

可以声明指向成员的指针,

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 ->*,这不是你每天都能看到的。

查看实际操作

A pointer to a member can be declared like

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

Here's how to use it (adaptation of your own code):

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);
    }
};

Pay particular attention to the operator ->*, which is not something you see every day.

See it in action.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文