当前位置:  开发笔记 > 编程语言 > 正文

纯虚方法VS. 功能指针

如何解决《纯虚方法VS.功能指针》经验,为你挑选了1个好方法。

最近我一直在设计Thread类库,我已经创建了一个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*);

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

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



1> user51568..:

首先,请务必阅读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*详细信息对您的类的用户是隐藏的,这很好.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有