在c++中理论中静态成员函数可通过类名::和函数名直接调用不需要对象,内部也没有this指针,是不可以直接访问非静态成员函数和非静态成员变量,只可以直接访问静态成员变量或函数;
解决方法:要想用静态成员函数去访问非静态成员函数或变量;需要给静态成员函数传一个对象的指针;
示例代码如下图
#include "stdafx.h"
#include <iostream>
using namespace std;
class A {
private:
int num;
public:
A(int num)
:num(num)
{
}
void add() {
++num;
}
static int getnum(void* arg) {
A* a = static_cast<A*>(arg);
a->add();
return a->num;
}
};
int main()
{
A* a1 = new A(4);
cout << A::getnum(a1) << endl;
return 0;
}
如此就可以用静态成员函数去访问非静态成员变量或函数;
在linux下创建线程用的C语言函数pthread_create();
int pthread_create(pthread_t* restrict tidp,const pthread_attr_t* restrict_attr,void* (*start_rtn)(void*),void *restrict arg);
其中第三个参数是需要传递任务函数的地址,且此函数只能是全局函数或者静态成员函数,不能是费静态成员函数,因此我们想要将非静态成员函数当作任务函数传入的话,就需要用到静态成员函数传入对象指针的方式去掉用非静态成员函数,然后将静态成员函数当作pthread_create()的第三个参数。
下面是pthread_create()函数的详细说明;
1、头文件:#include <pthread.h>
2、函数声明:
int pthread_create(pthread_t* restrict tidp,const pthread_attr_t* restrict_attr,void* (*start_rtn)(void*),void *restrict arg);
3、输入参数:(以下做简介,具体参见实例一目了然)
(1)tidp:事先创建好的pthread_t类型的参数。成功时tidp指向的内存单元被设置为新创建线程的线程ID。
(2)attr:用于定制各种不同的线程属性。APUE的12.3节讨论了线程属性。通常直接设为NULL。
(3)start_rtn:新创建线程从此函数开始运行。无参数是arg设为NULL即可。
(4)arg:start_rtn函数的参数。无参数时设为NULL即可。有参数时输入参数的地址。当多于一个参数时应当使用结构体传入。(以下举例)
4、返回值:成功返回0,否则返回错误码。