2013-07-11 53 views
0

我有一个类,我试图实现作为一个抽象类来最大限度地重用代码。然而,两个派生类之间的共同点的主要部分在于每个类都有消费者和生产者线程。我想知道是否可以让每个静态成员函数调用一个虚拟成员函数来完成所有的基础工作。具有虚拟工作者函数的C++继承和线程

基本上,下面的代码是允许的还是我做的事情超级哈克,或者会让编译器大叫/尖叫着我?

// in AbstractClass.h 
class AbstractClass { 
    // some code here including constructors/destructors 
protected: 
    virtual int Worker() = 0; // derived class provides implementation 
private: 
    static void* Thread(void* args); 
}; 

// in AbstractClass.cpp 
static void* AbstractClass::Thread(void* args) { 
    AbstractClass myobject = static_cast<AbstractClass*>(args); 
    myobject->Worker(); 
} 

基本上我想知道派生类“工人”是否会被称为这种方式?请注意,通过传递Thread()函数来调用p_thread_create()。

感谢您的帮助,因为我尝试提高对继承和虚函数的理解,以及如何使用它来最大化代码重用。

+1

编译器不会叫喊,它会看到静态转换并假设你知道你在做什么。考虑使用更安全的C++ 11线程。 –

+0

@ n.m。我到了那里,我保证!我想暂时使用p_threads,因为我想深入了解潜在的魔法。 –

回答

1

是的代码看起来很好,你的假设是正确的。虚拟函数的目的是无论调用哪个超类签名,函数的派生版本都会被调用。

使用pthreads和C++,你使用的方法是完全合理的,而不是hackey。但是,我会在一个单独的类中创建线程,该类将包含静态类方法。这将阻止线程混入派生类中。

struct ThreadManager 
{ 
    ThreadManager(AbstractWorker* worker) 
    { 
    mWorker = worker; 
    mThread = ThreadStart(threadFunc, this); /* made up thread code :) */ 
    } 
    ~ThreadManager() 
    { 
    ThreadStop(mThread); 
    } 

    static void* threadFunc(void* args) 
    { 
    ThreadManager* manager = static_cast<ThreadManager*>(args); 
    manager->mWorker->Work(); 
    } 

    AbstractWorker* mWorker; 
    Thread mThread; 
} 

请注意,使用pthread时,实际上需要一个静态函数。

+0

这是我的难题......如果我在派生类中创建线程,那么我将失去很多将在派生类之间共享的代码。因此,我真的失去了抽象类的理由。 –

+0

@这是我会说明的。 - 答案已更改 - 使用抽象接口创建一个单独的具体对象。 –

+0

@ It'sPete顺便说一句,你可能没有意识到这一点,但静态函数实际上是pthread需要的。你不能有一个正常的函数指针指向一个虚拟函数,并期望它像虚拟函数一样工作。 –