不能在没有对象的情况下调用成员函数'virtual void ThreadBase::doTask()'



我如何从threadbase.h调用虚拟函数在pthread_create中运行的静态指针函数?

当我遵守它时,显示 ->"无法调用成员函数'virtual void 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();
}

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

更改对Dotask的调用:

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

和调用pthread_create to:

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

原因:pthread_create的第四个参数将作为参数作为threadbase ::线程启动时的参数。

相关内容

最新更新