|
发表于 2014-5-4 16:04:57
|
显示全部楼层
节点遍历inline void traverse(Node& node)
{
if (_traversalMode==TRAVERSE_PARENTS) node.ascend(*this);
else if (_traversalMode!=TRAVERSE_NONE) node.traverse(*this);
}
只说node.traverse(*this)往子节点遍历:node是基类指针,traverse是虚函数,所以node.traverse(*this)会调用派生类即void Group::traverse(NodeVisitor& nv),而
void Group::traverse(NodeVisitor& nv)
{
for(NodeList::iterator itr=_children.begin();
itr!=_children.end();
++itr)
{
(*itr)->accept(nv);//每个子节点
}
}
void Node::accept(NodeVisitor& nv)
{
if (nv.validNodeMask(*this))
{
nv.pushOntoNodePath(this);
nv.apply(*this);
nv.popFromNodePath();
}
}
所以最终都nv.apply(*this)即执行nodevisitor对应节点的apply()函数,并且apply()一定要添加traverse(node),即继续往当前子节点的子节点遍历。
|
|