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++確實很靈活,我們要用好這把雙刃劍 : )