我正在尝试将一些代码从 Objective-C 转换为 C++
我有一个 CCNode,我想递归遍历它拥有的所有节点。
我不知道如何写这个:
for(CCNode* child in [self children])
{
}
谁能帮我翻译一下?
更新:这是另一个 SO 答案的代码:CCNode recursive getChildByTag
我正在尝试将一些代码从 Objective-C 转换为 C++
我有一个 CCNode,我想递归遍历它拥有的所有节点。
我不知道如何写这个:
for(CCNode* child in [self children])
{
}
谁能帮我翻译一下?
更新:这是另一个 SO 答案的代码:CCNode recursive getChildByTag
由于 C++ 中没有快速枚举,您可以通过迭代器或计数器对其进行迭代,当计数器达到集合大小时停止。然后使用objectAtIndex()获取每个对象:
for(int i = 0; i < getChildren()->count(); i++)
{
CCNode *child = getChildren()->objectAtIndex(i);
< Your code >
}
我假设您使用的是 Cocos2d-iPhone 的 c++ 端口?如果是这种情况,那么您可以使用 Cocos2d-x 的宏来迭代 CCArrays。
例子:
CCObject* pObj = nullptr;
CCARRAY_FOREACH(getChildren(), pObj)
{
// do something
}
在 C++11 中,我们有具有for
类似语法的基于范围的循环。
为此,您需要一个基于迭代器的包装器。
最简单的方法是使用# include <boost/iterator/iterator_facade.hpp>
. 将基于索引的容器包装在iterator_facade
at begin
/end
中非常容易。
如果你已经写了一个struct my_iterator:boost::iterator_facade<my_iterator> {...};
类型,那么只需写my_iterator begin( CCArray& )
、const
版本和end
版本。
完成此操作后,您将获得:
for(CCObject* obj : *getChildren()) 很接近,但使用CCObject
而不是CCNode
. 你碰巧知道this
are的孩子CCNode
,但 Cocos2d 界面只告诉你孩子是CCObject
s。
我会编写一个CCArrayAs<T>
适配器函数,它返回一个CCArray
带有类型T
信息的包装。IE:
template<typename T>
struct CCArrayAs {
CCArray* arr;
};
您会注意到它不会在T
任何地方使用该类型。我们再次编写迭代器,但是对于上面struct
的,返回类型而不是 aCCObject*
是T*
using static_cast
。然后我们编写begin( CCArrayAs& )
、end
和const
版本,我们从中得到的是:
for( CCNode* node : CCArrayAs<CCNode>(getChildren()) )
这非常接近于 Objective-C 的语法。如果您想要更漂亮的语法,请编写CCArrayAs<CCNode> GetChildren( CCNode* self ) { return self->getChildren(); }
,为您提供:
for( CCNode* node : GetChildren(this) )
这样做的缺点是它有很多样板,所有这些都是为了获得更漂亮的语法。这是您希望 Cocos2d 开发人员做的事情,而不是必须自己做。
如果你不想做所有这些工作,你可以简单地遍历索引。有关该解决方案,请参阅@RamyAlZuhouri 的答案。这要容易得多。