[英]cannot call member function 'virtual void ThreadBase::doTask()' without object
How can I call virtual function from ThreadBase.h to use this in static pointer function that run in pthread_create ? 如何从ThreadBase.h调用虚拟函数以在pthread_create中运行的静态指针函数中使用此函数?
When I complied it, show -> "cannot call member function 'virtual void ThreadBase::doTask()' without object" 当我编译它时,显示->“无法在没有对象的情况下调用成员函数'virtual void ThreadBase :: doTask()'”
Thanks you so much. 非常感谢。
// 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();
}
Can you advise me on what to do? 你能建议我做什么吗? Thanks.
谢谢。
Change the call to doTask to: 将对doTask的调用更改为:
static_cast<ThreadBase*>(para)->doTask();
And the call pthread_create to: 并调用pthread_create来:
pthread_create( &thread_encoder, NULL, &ThreadEncoder :: run, this);
Reason: the fourth argument to pthread_create will be passed as the argument to your ThreadBase::run method when the thread starts. 原因:线程启动时,pthread_create的第四个参数将作为参数传递给ThreadBase :: run方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.