这是实现自定义事件处理程序的正确方法吗?

时间:2011-08-12 19:38:34

标签: c++ event-handling function-pointers

我一直在寻找一种将自定义事件处理程序添加为c ++类成员函数的方法。发现这段代码确实有效。 我需要分离库类和用户代码,允许用户代码自定义库类。 这是代码的概念。这样做是否正确?在我的问题中,线程安全性超出了范围。编译器是gcc。 用户代码非常整洁。没有继承,虚函数,使用的模板

#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 main()
{
  aaa aaa1;
  aaa1.customhandler = &dostuff;
  aaa1.customhandler();
  aaa1.customhandler = &dostuff2;
  aaa1.customhandler();
}

2 个答案:

答案 0 :(得分:2)

好吧,如果你有一个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 ();
}

关于它的好处是你可以使用可选的附加参数将函数或函子绑定到处理程序。

您的原始代码也可以使用,但是如果我想调用类的方法而不是普通的函数呢?如果我还希望在调用它时传递一些我可以在处理程序中访问的状态,该怎么办?这是std::function使其成为C ++标准的众多原因之一。

答案 1 :(得分:1)

我尝试了你的代码,它运行正常。 只是为了您的信息,还有另一种方法来编写函数指针。在这种情况下,您的代码可以简化一点。在这里,我对函数指针的typdef使用略有不同的语法,这样你就可以放弃&amp;符号。

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

两种方式都很好,我只是想我会告诉你另一种方法。