想写一个线程池,用一个成员函数作为callback,但是在编译过程汇总遇到问题(类型不匹配)
void * (A::) (void *)
void * (*) (void*)
之后查了一下,才知道C++中的成员函数由于隐含的this指针,导致与回调函数类型不匹配,解决方法有两种:
1.不使用成员函数作为回调函数,如果想调用类中的成员可以将该函数声明为友元;
2.使用静态成员函数(静态没有this指针)静态成员函数具有两大特点:其一,可以在没有类实例的情况下使用;其二,只能访问静态成员变量和静态成员函数,不能访问非静态成员变量和非静态成员函数。由于在C++中使用类成员函数作为回调函数的目的就是为了访问所有的成员变量和成员函数。
由于在项目中类的声明和定义分别在.h和.cpp中,因此对于类中的静态成员需要在.cpp文件中初始化,否则报错:
undefined reference to `A::m_arr'
对于各种类型静态成员的初始化总结如下:
-
class Test
-
{
-
public:
-
Test();
-
~Test();
-
private:
-
static int m_i;
-
static int m_a[10];
-
static int *m_p;
-
static B b;
-
static C *c;
-
}
之后再cpp文件中对这些静态成员初始化即可。
-
int Test::m_i = 0;
-
int Test::m_a = {0};
-
int Test::m_p = NULL;
-
C Test::c = NULL;
-
B Test::b;
对于stl的初始化如下:
-
对于STL容器静态变量,初始化方法比较复杂,需要借助一个静态构造函数,通过拷贝构造函数来实现初始化
-
simple.h定义为:
-
#include <map>
-
using namespace std;
-
typedef map<int, int> INT2INT;
-
class Simple
-
{
-
public:
-
Simple(void);
-
~Simple(void);
-
static bool Find(int key);
-
private:
-
static INT2INT CreateMap(void);
-
static INT2INT _i;
-
};
-
simple.cpp定义为:
-
bool Simple::Find(int key)
-
{
-
INT2INT::iterator it = _i.find(key);
-
if (it == _i.end())
-
return false;
-
return true;
-
}
-
-
INT2INT Simple::CreateMap(void)
-
{
-
INT2INT _tmp;
-
return _tmp;
-
}
-
INT2INT Simple::_i(Simple::CreateMap());
阅读(2732) | 评论(0) | 转发(0) |