~~~~我的生活,我的点点滴滴!!
今天在看一些c++开源代码时,无意间看到下面这段代码,突然发觉看起好陌生,完全不懂这样用的意义是什么呀?
void Director::popScene(const std::function<void(Scene* &)>& callback) { CCASSERT(_runningScene != nullptr, "running scene should not null"); _scenesStack.popBack(); ssize_t c = _scenesStack.size(); if (c == 0) { end(); } else { _sendCleanupToScene = true; _nextScene = _scenesStack.at(c - 1); if(callback) { callback(_nextScene); } } } auto callback = [](Scene*& scene){scene = TransitionJumpZoom::create(1.0f, scene);}; Director::getInstance()->popScene(callback);
下面的callback = [](Scene *& scene){}; 这是c++ 11的新语法,这里我不在科普了,前面的blog文中有讲到,主要是看下这个绕眼的符号" *& "
这表示是什么意思,我经常见到" ** "但是我自己不用,我也烦这样使用的人。今天见到这个后,我更加费解了。这样用的意思是什么?为什么要这
样用?好处?一连串的疑问浮现出来,下面我们一起来看看。
<span style="font-family:Arial;color:#666666;"><span style="font-size: 14px; line-height: 24px;">void Director::popScene(const std::function<void(Scene* &)>& callback) { }</span></span>
意思相对的两个东西,把它们放在一起有什么意义呢?。为了理解指针的这种做法,我们先复习一下C/C++编程中无所不在的指针概念。我们都知道
Scene*的意思:指向某个对象的指针,此对象的类型为Scene。
Scene* p = new Scene(); func1(p); void func1(Scene *pScene) { DoSomething(pScene); pScene = // 其它对象的指针 }
数过程中只修改了pScene的值,前没有修改上面调用者func1(p)的值,如果p指向某个位于地址0x008a00的对象,当func1返回时,它仍然指向这个
特定的对象。现在假设你想要在func1中修改p的值。这是你的权利。调用者传入一个指针,然后函数给这个指针赋值。以往一般都是传双指针,即
指针的指针,例如,Scene**。
func1(p); void func1(Scene *& pMyClass); { *pMyClass = new Scene(); …… }
其实,它和前面所讲得指针的指针例子是一码事,只是语法有所不同。传递的时候不用传p的地址&p,而是直接传p本身:
Scene* p = NULL;
func1(p);
在调用之后,p指向一个新的对象。一般来讲,引用的原理或多或少就象一个指针,从语法上看它就是一个普通变量。所以只要你碰到*&,就应该想
到**。也就是说这个函数修改或可能修改调用者的指针,而调用者象普通变量一样传递这个指针,不使用地址操作符&。
我们回归到最开始的代码,看callback(_nextScene);这一行代码,_nextScene应该是类的成员变量,他需要保持和关心这个别人对他自己的一些操作
与处理,也就是在别的地方改变了值,需要反馈回来,故用了 "*&" ,现在问题就开朗多了。