梁越

c++静态成员函数访问非静态成员变量的几种方法记录

0 人看过

面试常问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);