一般情况下,类的静态函数是无法读取非静态成员变量的,当然windows下,什么问题都有办法,可以通过其它的方法来实现静态函数对非静态成员变量的读取。
方法一:
class A
{
public:
int Fun1(void);
int mem;
void fun1();
static int Fun2(A& a);
};
static int A::Fun2(const A&a)
{
a.Fun1();
a.mem=1;
}
void A::fun1()
{
Func2(this);
}
通过fun1()函数将对象指针传递给Func2。
但这种方法有一个前提,就是静态函数的参数可以是类引用,那如果参数不能是类引用或类指针呢?那就可以再绕一下,如下,
方法2:
class A
{
public:
static A& refA;
int Fun1(void);
int mem;
void fun1();
static int Fun2(...);
};
A::fun1()
{
refA=this;
}
然后,
A::Fun2(...)
{
refA.mem=10;
}
当然这些方法也有缺陷,那就是一定得在类实例化后才可以传递this指针。
根据我的试验,上面几种方法对应静态回调函数不适合(函数的参数已规定,无法修改),于是我在类的实现中添加了一个全局类指针,A *pa;然后在初始化中,将this指针赋给pa,这样回调函数就可以顺利的读取全局变量pa里的数据了。
方法一:
class A
{
public:
int Fun1(void);
int mem;
void fun1();
static int Fun2(A& a);
};
static int A::Fun2(const A&a)
{
a.Fun1();
a.mem=1;
}
void A::fun1()
{
Func2(this);
}
通过fun1()函数将对象指针传递给Func2。
但这种方法有一个前提,就是静态函数的参数可以是类引用,那如果参数不能是类引用或类指针呢?那就可以再绕一下,如下,
方法2:
class A
{
public:
static A& refA;
int Fun1(void);
int mem;
void fun1();
static int Fun2(...);
};
A::fun1()
{
refA=this;
}
然后,
A::Fun2(...)
{
refA.mem=10;
}
当然这些方法也有缺陷,那就是一定得在类实例化后才可以传递this指针。
根据我的试验,上面几种方法对应静态回调函数不适合(函数的参数已规定,无法修改),于是我在类的实现中添加了一个全局类指针,A *pa;然后在初始化中,将this指针赋给pa,这样回调函数就可以顺利的读取全局变量pa里的数据了。