繁体   English   中英

没有对象就无法调用成员函数“ virtual void ThreadBase :: doTask()”

[英]cannot call member function 'virtual void ThreadBase::doTask()' without object

如何从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来:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM