纯虚拟方法VS.函数指针
-
20-08-2019 - |
题
最近我一直在设计一个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 *的细节从你的类,这是很好的用户隐藏。
不隶属于 StackOverflow