c++静态成员函数访问非静态成员变量的几种方法记录
面试常问c++基础题
我们知道静态成员函数是不能直接访问类的非静态成员的,只能访问静态成员,因为静态成员函数属于类,但是独立于对象存在,并且不占类空间,不在对象内存中
方法1
在静态函数的形参表里加上实例的地址,也就是
class A
{
public:
static void test(A *a)
{
a->m_a += 1;
}
void hello()
{
}
private:
static int m_staticA;
int m_a
};
方法2
使用全局变量,其实是把对象也静态化了
A g_a;
class A
{
public:
static void test()
{
g_a.m_a += 1;
}
void hello()
{
}
private:
static int m_staticA;
int m_a
};
方法3
如果类是个单例,可以定义类内静态成员指向自己,即通过静态成员找到this指针,和1的原理差不多
class A
{
public:
A()
{
m_gA = this;
m_a = 999;
}
static void test()
{
m_gA->m_a += 1;
}
void hello()
{
}
private:
static int m_staticA;
static A *m_gA;
int m_a;
};
方法4
和1的原理也差不多,不过传的是地址进来
class A
{
public:
static void test(void *pData)
{
A *a = (A *)pData;
a->m_a += 1;
}
void hello()
{
}
private:
static int m_staticA;
int m_a
};
A a;
test(&a);