【问题标题】:cannot call member function 'virtual void ThreadBase::doTask()' without object不能在没有对象的情况下调用成员函数“virtual void ThreadBase::doTask()”
【发布时间】:2016-11-28 14:49:31
【问题描述】:

如何从 ThreadBase.h 调用虚函数以在 pthread_create 中运行的静态指针函数中使用它?

当我编译它时,显示->“无法调用成员函数'virtual void ThreadBase::doTask()' without object”

非常感谢。

// 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();

}

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

【问题讨论】:

    标签: c++


    【解决方案1】:

    将对 doTask 的调用更改为:

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

    然后调用 pthread_create 来:

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

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

    【讨论】:

    • 嗨,如果你调用基类的纯虚拟基类,输出会是什么
    • 输出将与调用覆盖相同,因为它正在调用覆盖
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    相关资源
    最近更新 更多