我正在尝试为将执行RAII的类编写示例程序,并将使用self this指针调用该线程。但是线程函数参数的数据类型被声明为前向声明。 请看一下示例程序 -
#include <iostream>
#include <thread>
using namespace std;
class test; // **forward declaration**
void thfunc (test *p) {
cout << p->value << endl;
return;
}
class test {
public:
int value;
thread t1;
test () {
value = 100;
t1 = thread(thfunc, this);
}
~test() {
t1.join();
}
};
int main () {
test * p = new test;
delete p;
return 0;
}
这是一个编译错误 -
fwd.cpp: In function 'void thfunc(test*)':
fwd.cpp:9:11: error: invalid use of incomplete type 'class test'
fwd.cpp:6:7: error: forward declaration of 'class test'
要解决这个问题,我将线程函数作为类的静态成员函数 -
class test {
public:
int value;
thread t1;
test () {
value = 100;
t1 = thread(thfunc, this);
}
~test() {
t1.join();
cout << "Dtor" << endl;
}
**static** void thfunc (test *p) {
cout << p->value << endl;
return;
}
};
这是正确的解决方法吗?我想将线程函数作为单独的库,但现在我必须将它们作为类的一部分。请建议。任何类型的帮助/指针/建议将不胜感激。
答案 0 :(得分:0)
使thfunc
成为静态成员是正确的,因为它将起作用。如果你想将它们分开是有原因的(有时有很好的理由),那么你仍然可以这样做。
这个函数只能在作为std::thread
的参数传递之前声明:
#include <iostream>
#include <thread>
using namespace std;
void thfunc (class test *p);
class test {
public:
int value;
thread t1;
test () {
value = 100;
t1 = thread(thfunc, this);
}
~test() {
t1.join();
}
};
void thfunc (test *p) {
cout << p->value << endl;
return;
}
int main () {
test * p = new test;
delete p;
return 0;
}