关于v3.3中对Node类的setPosition的重载的BUG

【问题描述】
原本我使用的是 cocos2d-x v3.2 版本的,我自己写了一个C++的类(假设为 PanZoomLayer ),然后对Node类的 setPosition 进行了重载。然后绑定Lua,提供Lua调用此类。
本来在 v3.2 版本的引擎中使用时没有任何问题的。

     后来我将引擎换成了 v3.3 版本的,可是问题来了:我自己写的PanZoomLayer 类,所重载的 setPosition 出现了死循环(stack overflow)。
     后来找了找原因,终于发现了,这个难道就是传说中的BUG么???

【问题分析】
一、我们先来看 3.2 和 3.3 版本的Node类中是如何实现 setPosition 的。
1、在 3.2 中是这样的:

             <img title = '3.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_311318_a1b8fecf0cc041c.png' > 

     2、而在 3.3 中却是这样的:
             <img title = '5.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_311318_991fd4f6ba8b0b8.png' > 

             <img title = '6.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_311318_ba8e2067a1af573.png' > 

二、而我自定义的PanZoomLayer 类对setPosition的重载是这样写的:

             <img title = '1.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_311318_8a98109fb08ac0e.png' > 

             <img title = '4.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_311318_11875e7be65ca1d.png' > 

三、可是呢,我在我自定义的类中调用:this->setPosition( Vec2(x, y) ); 时,所重载的 setPosition 出现了死循环(stack overflow)。

    他所调用的顺序会是这样的:
    1、首先,调用 this->setPosition( Vec2(x, y) );
    2、然后,进入PanZoomLayer 类的 setPosition( const Vec2& position );
    3、然后,执行 Node::setPosition(position);
    4、然后,执行 Node 类中 void Node::setPosition(const Vec2& position) 里的语句 setPosition(position.x, position.y);

    5、问题来了!!!
            顺序4 中的 setPosition(position.x, position.y); 调用的竟然是 PanZoomLayer 类中的 void setPosition(float x, float y); 

    6、然后陷入了死循环。。。

【自行解决方案】

    我将引擎cocos v3.3 中的Node类的 setPosition(const Vec2& position) 里的语句 setPosition(position.x, position.y);
    更改为:Node::setPosition(position.x, position.y); 
    也就是在前面加上 “ Node:: ” 后,得到了解决。
    
    此时,Node::setPosition(position.x, position.y); 调用的将是 Node 类中的 setPosition(float x, float y); 。而不是我自己定义的类 PanZoomLayer 类中的 void setPosition(float x, float y); 

【总结】

    可能大家都没有遇到过这样的问题。
    因为我遇到了,所以特此发帖,希望小伙伴们不要踩坑。。。

【补充说明】

    在上述代码中,可以发现:其实在 v3.2 中也出现了这个问题。

    如果我再自定义的HelloWorld 类中,对 setPosition 的重载是如下写法。

    那么我在自定义的 HelloWorld 类中,调用 this->setPosition(Vec2(x, y));
    也会出现同样的问题:死循环(stack overflow)。

那么问题就来了, 顺序4 中的 setPosition(position.x, position.y); 调用的是 PanZoomLayer 类中的 void setPosition(float x, float y);
然后PanZoomLayer::setPosition(float x, float y)会调用Node::setPosition(float x, float y);
3.3的Node::setPosition(float x, float y)不会再调用别的setPosition(), 然后调用完成,popStack,popStack,popStack…
为什么会死循环?

不用修改引擎的代码,把你重写的 void setPosition(float x, float y){this->setPosition(vec2(x, y));} 注释掉就没问题了,是你这里引起问题

:12::12::12:

这个。。。我也不知道说什么好了。。。

去掉 void setPosition(float x, float y){this->setPosition(vec2(x, y));} 的话,当然没有问题。
但是调用this->setPosition(x, y) 的时候,不就是只调用了Node类的函数了吗,那么我自己写的 setPosition(Vec2(x, y)) 处理其他逻辑的代码 就不被调用了。
而且给其他队友用的时候,他们不小心写成 this->setPosition(x, y) 时,编译器不会报错,可是执行的却是Node类的函数。那么他们哪里错了都不知道了吗。

:13: 是啊。。。这样 调用 是会 死循环的 可以 调用 继承 的 Sprite::setposition(x,y)

其实不单此 setposition会死循环 setString 也会哦。