OO将函数传递给类的方法

时间:2013-04-17 14:32:20

标签: c++ oop design-patterns

我正在使用旧版C库进行联网。它允许我创建一个套接字服务器。我必须传递一个函数指针到库来处理协议 - 例如处理消息结构,标题长度等内容。

在C程序中,您只需将指针传递给函数,例如get_protocol。但是OO的方法是什么。

我有一个包装类,我们称之为socket_server。我希望能够在运行时传入不同协议的必需函数指针。

我该怎么做?这是策略模式解决的问题吗?

修改

我喜欢std :: function的想法,但我们暂时停留在VS2008上,所以C ++ 11还没有对我开放。

4 个答案:

答案 0 :(得分:2)

使用std::function

class Test
{
    std::function<void()> func;
public:
    Test(const std::function<void()> &func) : func(func) {}

    void do_something()
    {
        func();
    }
};

void my_func()
{
    std::cout << "Hello" << std::endl;
}

int main()
{
    Test test(my_func);
    test.do_something();
}

基于模板

template <typename Func>
class Test
{
    Func *func;
public:
    Test(const Func &func) : func(func) {}

    void do_something()
    {
        func();
    }
};

void my_func()
{
    std::cout << "Hello" << std::endl;
}

int main()
{
    Test<void()> test(my_func);
//  Test<decltype(my_func)> test(my_func); // This is even better
    test.do_something();
}

答案 1 :(得分:1)

正如评论者建议您应该使用C ++ 11新功能std::function

个人而言,在C ++ 03中,我已经喜欢了仿函数。整个<algorithm>标题是pro-functors,(当然现在是C ++ 11 std::function

仿函数是一个覆盖operator()的对象,您可以在其上调用()来执行此类函数。

您可以将operator()视为“perform()”函数,就像简化的单一策略一样。

struct Functor
{
    void operator()(int param_a, const string& param_b)
    {
          // perform what you want
    }
    int my_member;
}

Functor f;
f(0,"go_std_function")

但除非你有充分的理由,否则请去std::function。它是手工编写器的概括,也是经典函数:任何可调用的东西: - )。

答案 2 :(得分:0)

如果我正确理解你。这是你需要做的:

在Header文件中,创建一个要作为静态传递的函数。例如:

static void* ThreadWorker(void* worker);

在您的源文件中,您可以这样称呼它:

pthread_create(&thread, NULL, ThreadWorker, (void *) worker);

该函数必须是静态的,因为编译器不知道哪个实例正在调用它。但我相信有人可以更好地解释它。

答案 3 :(得分:0)

“OO C”这样做的方法是通过void *值来允许将一些上下文传递给回调函数。传递的实际值将是指向回调函数将理解的某种struct的指针(在转换回实际类型之后)。这不是类型安全的,但它在实践中非常有效,并且struct可以轻松地保存指向C ++对象的指针,从而允许将thunk关闭为一个合理的API。

如果没有这样的指针,你实际上只限于调用静态方法作为你的回调(或者将对象引用放在全局变量中,这确实令人讨厌!)当然,那时它已经不再是真的了也可以是OO C接口,但更糟糕的是,考虑重写或切换到其他东西之上构建它会变得很明智。