2011-08-12 46 views
1

我正在寻找一种将自定义事件处理程序添加为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(); 
} 
+3

如果它为你编译和工作,那就好了。否则你的问题是什么? –

+2

'用户代码非常整洁并没有继承,虚拟函数,模板使用'这两个语句是相互排斥的。 –

+0

@ Als代码大小非常小:) – tohaz

回答

1

我试过你的代码,它工作正常。 仅供参考,还有另一种编写函数指针的方法。在这种情况下,您的代码可以简化一点。在这里,我使用函数指针的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; 
} 

两种方式都很好,我只是想我会告诉你另一种方式来做到这一点。

+0

谢谢,这样用户代码更加整洁:) – tohaz

2

好吧,如果你有一个Boost库或启用0X-C++编译器,你可以有一个代码像这样:

#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++标准的众多原因之一。

+0

自定义函数是静态的。有没有办法让它们变成非静态的? – tohaz

+0

@tohaz:如果函数对于翻译单元不是本地的,则可以删除示例中的static。所以是的,静态可以被删除而不会破坏预期的功能。 – 2011-08-12 20:11:28

相关问题