zoukankan      html  css  js  c++  java
  • Static函数访问非Static函数

    https://www.cnblogs.com/rickyk/p/4238380.html

    方法1、

    静态函数的形参表里加上实例的地址:

    class A
    {
    public:
        static void test(A *a)
        {
            a->m_a += 1;
        }
        void hello()
        {
        }
    private:
        static int m_static A;
        int m_a
    };

    这样在你回调函数的时候,你可以通过这个来让本身不能访问成员非静态变量的静态函数(太拗口)来访问非静态成员变量。

    方法2、

    其实这个方法在GLIB中用的很多,就是放上全局变量地址:

    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指针赋值给那个静态成员,然后在静态成员函数内部就可以放心大胆的使用了。

    如果保证类是单例?下面运行会出问题!

    class A
    {
    public:
        A()
        {
            m_gA = this;
        }
        static void test()
        {
            m_gA.m_a += 1;
        }
        void hello()
        {
        }
    private:
        static int m_staticA;
        static A *m_gA;
        int m_a
    };

    方法4:

    和方法一比较像,但他的方向思想更多的是针对内存块这个概念,意思就是在静态函数的形参比加上一个void *的内存首地址,然后在内部做转换

    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);

    如上,我整理了4种方法,当然方法还有很多,其实绕了这么大远路,我们的希望就是不破坏回调函数整洁的函数接口(加上自己的实例指针)而做的妥协,如果你更喜欢通过改变接口或者通过用Java类似的interface方式来实现,那也没有问题,这里主要就是提供给大家一个思路,C++确实很灵活,我们要用好这把双刃剑 : )

     
  • 相关阅读:
    fenby C语言 P9
    fenby C语言 p7
    fenby C语言 P6
    fenby C语言
    让博客园博客自动生成章节目录索引
    python学习之路:生成器并行运算
    Python学习之路:生成器
    Python学习之路:装饰器实现终极版
    Python学习之路:装饰器实现2
    Python学习之路:装饰器实现
  • 原文地址:https://www.cnblogs.com/wllwqdeai/p/10114186.html
Copyright © 2011-2022 走看看