这是实现自定义事件处理程序的正确方法吗? 我正在寻找一种方法,将自定义事件处理程序添加为C++类成员函数。我发现这段代码确实有效。 我需要分离库类和用户代码,允许用户代码自定义库类。 下面是代码的概念。这样做对吗?线程安全性超出了我的问题范围。编译器是gcc。 用户代码非常整洁。不使用继承、虚拟函数和模板 #include <stdio.h> typedef void fn(); class aaa { public: aaa() : customhandler(NULL) {} fn *customhandler; };

这是实现自定义事件处理程序的正确方法吗? 我正在寻找一种方法,将自定义事件处理程序添加为C++类成员函数。我发现这段代码确实有效。 我需要分离库类和用户代码,允许用户代码自定义库类。 下面是代码的概念。这样做对吗?线程安全性超出了我的问题范围。编译器是gcc。 用户代码非常整洁。不使用继承、虚拟函数和模板 #include <stdio.h> typedef void fn(); class aaa { public: aaa() : customhandler(NULL) {} fn *customhandler; };,c++,event-handling,function-pointers,C++,Event Handling,Function Pointers,如果您有一个Boost库或启用C++0x的编译器,您可能会有这样的代码: #include <cstdio> #include <functional> struct Foo { std::function<void ()> handler; void invoke () { if (handler) { handler (); } else

如果您有一个Boost库或启用C++0x的编译器,您可能会有这样的代码:

#include <cstdio>
#include <functional>

struct Foo
{
    std::function<void ()> handler;

    void invoke ()
    {
        if (handler)
        {
            handler ();
        }
        else
        {
            printf ("Oops, handler is not there!\n");
        }
    }
};

static void myHandler1 (int arg)
{
    printf ("Handler #1 (arg=%d)\n", arg);
}

static void myHandler2 ()
{
    printf ("Handler #2\n");
}

int main ()
{
    Foo f;

    f.invoke ();

    f.handler = std::bind (&myHandler1, 13);
    f.invoke ();

    f.handler = &myHandler2;
    f.invoke ();
}
#包括
#包括
结构Foo
{
函数处理程序;
无效调用()
{
if(处理程序)
{
handler();
}
其他的
{
printf(“Oops,处理程序不在那里!\n”);
}
}
};
静态无效myHandler1(内部参数)
{
printf(“处理程序#1(arg=%d)\n”,arg);
}
静态无效myHandler2()
{
printf(“Handler#2\n”);
}
int main()
{
福福;
f、 调用();
f、 handler=std::bind(&myHandler1,13);
f、 调用();
f、 handler=&myHandler2;
f、 调用();
}
它的好处是,可以使用可选的附加参数将函数或函子绑定到处理程序


您的原始代码也可以工作,但如果我想调用类的方法而不是普通函数,该怎么办?如果我还想传递一些在调用处理程序时可以在处理程序内部访问的状态,该怎么办?这就是为什么代码> STD::函数将其纳入C++标准的原因之一。

< P>我尝试了你的代码,它运行良好。 仅供参考,还有另一种编写函数指针的方法。在这种情况下,您的代码可以简化一点。在这里,我对函数指针的typdef使用了稍微不同的语法,它允许您删除&符号

#include "stdafx.h"
#include <stdio.h>

typedef void (*fn)();

class aaa
{
public:
    aaa() : customhandler(NULL) {}
    fn customhandler;
};

void dostuff() {
    printf("doing stuff 1\n");
}
void dostuff2() {
    printf("doing stuff 2\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    aaa aaa1;
    aaa1.customhandler = dostuff;
    aaa1.customhandler();
    aaa1.customhandler = dostuff2;
    aaa1.customhandler();
    return 0;
}
#包括“stdafx.h”
#包括
typedef void(*fn)();
aaa级
{
公众:
aaa():customhandler(NULL){}
fn客户处理程序;
};
void dostuff(){
printf(“做事情1\n”);
}
void dostuff2(){
printf(“做事情2\n”);
}
int _tmain(int argc,_TCHAR*argv[]
{
aaa aaa1;
aaa1.customhandler=dostuff;
aaa1.customhandler();
aaa1.customhandler=dostuff2;
aaa1.customhandler();
返回0;
}

这两种方法都很好,我只是想向您展示另一种方法。

如果它能编译并对您有效,那就没问题了。否则您的问题是什么?
用户代码非常整洁
&
[没有]继承、虚拟函数、使用的模板
这两个语句是互斥的。@Als代码大小非常小:)自定义函数是静态的。有没有办法使它们成为非静态的?@tohaz:在我的示例中,如果函数不是翻译单元的本地函数,则可以删除静态。因此,可以在不破坏预期功能的情况下删除静态。
#include "stdafx.h"
#include <stdio.h>

typedef void (*fn)();

class aaa
{
public:
    aaa() : customhandler(NULL) {}
    fn customhandler;
};

void dostuff() {
    printf("doing stuff 1\n");
}
void dostuff2() {
    printf("doing stuff 2\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    aaa aaa1;
    aaa1.customhandler = dostuff;
    aaa1.customhandler();
    aaa1.customhandler = dostuff2;
    aaa1.customhandler();
    return 0;
}