帝国cms调用网站地址,阳江招聘网娱乐业,视频分销网站建设,wordpress标签手册https://www.cnblogs.com/rickyk/p/4238380.html 大家都知道C中类的成员函数默认都提供了this指针#xff0c;在非静态成员函数中当你调用函数的时候#xff0c;编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C灵活性下面#xff0c;类还具备了静态成员和静…https://www.cnblogs.com/rickyk/p/4238380.html 大家都知道C中类的成员函数默认都提供了this指针在非静态成员函数中当你调用函数的时候编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C灵活性下面类还具备了静态成员和静态函数即 class A
{
public:static void test(){m_staticA 1;}
private:static int m_staticA;int m_a
}; 此时你的test函数只能去访问m_staticA成员而不能去访问m_a。同学可能会问这算什么问题问题都是在应用场景中才能体现的我一开始也是不以为意直到我遇到了回调函数这个烦人的问题我才真正静下心来去考虑这个知识点。 先简单说下回调在座的应该都知道回调的含义在C中回调主要体现就是回调函数当然C中也有仿函数等其他用法抛开这些单纯在回调函数这个点上我们进行如下讨论。 由于C类的成员函数都隐含了this指针如果我直接注册比如 typedef void (A::*FunPtr)();
FunPtr p A::hello;
p(); 此时程序会报错提示信息是你缺少一个this指针意味着你要真的想使用p你必须有一个分配好空间的实例才能来调用 typedef void (A::*FunPtr)();
FunPtr p A::hello;A a;
A *pA new A();(a.*p)();
(pA-*p)(); 当然如果仅仅是对C的类静态函数进行回调函数注册你是不需要考虑this指针的 typedef void (A::*FunPtr)();
FunPtr p A::test;
p(); 但问题就是你此时的静态函数是不能拥有你的成员变量的看到了吧问题来了。面对这种需求我们就真正应该静下心来好好想想究竟如何才能让静态函数去访问非静态成员变量这个问题了。 方法一 有一个很取巧的办法就是在静态函数的形参表里加上实例的地址也就是 class A
{
public:static void test(A *a){a-m_a 1;}void hello(){}
private:static int m_staticA;int m_a
}; 这样在你回调函数的时候你可以通过这个来让本身不能访问成员非静态变量的静态函数太拗口来访问非静态成员变量。 方法二 其实这个方法在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
}; 这种方法我们了解就好全局变量我们并不推荐。 方法三 大家都知道静态成员函数不能访问非静态成员但别忘了他们可以访问静态成员也就是说如果我们的这个类是个单例我们完全可以在创建的时候把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
}; 方法四 和方法一比较像但他的方向思想更多的是针对内存块这个概念意思就是在静态函数的形参比加上一个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确实很灵活我们要用好这把双刃剑