纯虚方法VS.功能指针

时间:2009-02-01 08:54:53

标签: c++ design-patterns abstract-class function-pointers

最近我一直在设计一个Thread类库,我已经创建了一个Thread抽象类,如下所示:

class Thread {
public:
    run() { /*start the thread*/ }
    kill() { /*stop the thread*/ }
protected:
    virtual int doOperation(unsigned int, void *) = 0;
};

真正的线程类将继承此抽象类并在其自己的逻辑中实现doOperation方法,类似于Strategy Pattern

问题在于我依赖于一个C后端库,它定义了在以下函数中运行线程:

int startThread(char* name, (int)(*)(unsigned int, void*), int, int, int, void*);

正如你所看到的;第二个参数是一个指向线程循环(main函数)的函数指针,这就是问题所在;因为我使用这个C函数在run方法中启动线程,所以我将doOperation的地址传递给第二个参数,由于类型不匹配,这不能完成。

我尝试使用reinterpret_cast返回一个指针,但我ISO-C ++禁止返回未初始化函数成员的指针。 我不知道如何克服这种冲突,使用静态方法是我猜的唯一解决方案,但它打破了我的设计模式!

1 个答案:

答案 0 :(得分:7)

首先,请务必阅读Michael Burr提供的链接,因为它包含了很好的信息。然后,这里是C ++ ish伪代码:

int wrapperDoOperation(int v, void *ctx)
{
    Thread *thread = (Thread *)ctx;
    return thread->doOperation(v);
}

class Thread {
public:
    run() {
         startThread("bla", wrapperDoOperation, bla, bla, bla, (void *)this);
    }
    kill() { /*stop the thread*/ }
protected:
    virtual int doOperation(unsigned int) = 0;

friend wrapperDoOperation ......;
};

这个想法是doOperation,作为Thread的成员函数,不需要void *上下文,你可以保留你在对象本身中作为上下文传递的任何东西。因此,您可以使用void指针将实际指针传递给doOperation。请注意,void *详细信息对您的类的用户是隐藏的,这很不错。