最近我一直在设计一个Thread类的库,我做了一个主题抽象类这样的:

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

实时线程类将继承这个抽象类,并实现doOperation方法在其自身的逻辑,类似的事情来战略图案

的问题是,我依靠它定义运行的线程在下面的函数为C后端库:

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

正如你可以看到;第二个参数是一个函数指针线程的循环(主函数),这里的问题是;因为我用这个C-函数来启动在run方法的线程,我doOperation的地址传递到所述第二参数,并且这不能完成,因为类型不匹配的。

我试图使用reinterpret_cast返回一个指针,但我ISO-C ++不允许对返回未初始化功能部件的一个指针。 我不知道如何解决此冲突,使用静态方法我想唯一的解决方案,但它打击了我的设计模式!

有帮助吗?

解决方案

首先,请务必仔细阅读迈克尔·伯尔提供的链接,因为它包含有用信息。然后,这里是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,作为主题的成员函数,不需要一个void *背景下,你可以只保留任何你会通过在对象本身的上下文。因此,您可以使用空指针这个指针传递的实际工作的doOperation。请注意,void *的细节从你的类,这是很好的用户隐藏。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top