2016-11-28 64 views
2

如何从ThreadBase.h中调用虚拟函数来在pthread_create中运行的静态指针函数中使用它?不能调用成员函数虚拟无效ThreadBase :: doTask()'没有对象

当我遵守它,展示 - >“不能调用成员函数‘虚拟无效ThreadBase :: doTask()’没有对象”

谢谢你这么多。

// ThreadBase.h 

class ThreadBase { 

public: 
    ThreadBase(); 
    void sayName(); 
    virtual void doTask() = 0; // --> dotask() 
    static void *run(void *para); 
    void start(); 
}; 

// ThreadBase.cpp 

#include <iostream> 
#include "ThreadBase.h" 
#include "ThreadEncoder.h" 
#include "pthread.h" 

using namespace std; 

ThreadBase :: ThreadBase() 
{ 

} 

void ThreadBase :: sayName() { 
    cout << "I am a RobnertsQ" << endl; 
} 

void *ThreadBase :: run(void *para) { 
    cout << "run()" << endl; 



     while(false) { 
      doTask(); // -> ***My problem 

      // (delaySleep) 
     } 
    } 

    void ThreadBase :: start() { 

     pthread_t thread_encoder; 
     pthread_create(&thread_encoder, NULL, &ThreadEncoder :: run, NULL); 
    } 

// ThreadEncoder.h 

#include <iostream> 

using namespace std; 

class ThreadEncoder : public ThreadBase { 

public: 
    ThreadEncoder(); 
    ThreadEncoder(int); 
    void doTask(); 

protected: 
    string getFullName() { 
     return "ThreadEncoder"; 
    } 

}; 

// ThreadEncoder.cpp 

#include <iostream> 
#include "ThreadBase.h" 
#include "ThreadEncoder.h" 

using namespace std; 

ThreadEncoder :: ThreadEncoder() 
{ 
    cout << "ThreadEncoder default " << endl; 
} 

ThreadEncoder :: ThreadEncoder(int delaySleep) 
{ 
    cout << "ThreadEncoder delaySleep = " << delaySleep << endl; 
} 

void ThreadEncoder :: doTask() { 
    cout << "ThreadEncoder doTask !!!" << endl; 

// main.cpp 

#include <iostream> 
#include "ThreadBase.h" 
#include "ThreadEncoder.h" 
//#include "ThreadGps.h" 

using namespace std; 

int main(){ 

    ThreadEncoder te; 

    te.start(); 

} 

你能告诉我该怎么做吗? 谢谢。

回答

0

更改调用doTask到:

static_cast<ThreadBase*>(para)->doTask(); 

而且调用pthread_create到:

pthread_create(&thread_encoder, NULL, &ThreadEncoder :: run, this); 

原因:给pthread_create第四个参数将作为参数传递给你的ThreadBase ::跑步传递方法在线程启动时。

+0

嗨,如果您调用基类的纯输出为 –

+0

,则输出将与调用覆盖相同,因为它*是*调用覆盖 – user1610015

相关问题