【问题标题】:void function not returning无效函数不返回
【发布时间】:2020-07-27 17:52:45
【问题描述】:

我在从 void 函数返回时遇到问题。

当找到名称(输入)时,我可以看到打印的输出,它返回 true。如果 lambda(或 name_checker)函数返回 true,则 void 函数应该返回,但它仍在实现函数的其余部分。

【问题讨论】:

  • 如果节点是ControlNode,则该函数在迭代并递归到所有子节点之前不会返回。返回一个表示成功的值是很常见的,这样可以避免无意义的递归。
  • 你怎么知道它还在实现其余的功能?因为,很明显,你错了。也许您将函数的其余部分与对函数的剩余递归调用混淆了?

标签: return void


【解决方案1】:

更改您的函数以返回bool,使用该返回值立即退出您找到的东西。像这样的

bool findTreeNodeRecursively(unsigned indent, const TreeNode* node, const std::function<bool(const TreeNode*)>& name_checker){

    for (unsigned i = 0; i < indent; i++)
    {
        std::cout << "   ";
    }
    if (!node)
    {
        std::cout << "!nullptr!" << std::endl;
        return false;
    }

    indent++;

    if(name_checker(node) == true){
        return true;
    }

    if (auto control = dynamic_cast<const ControlNode*>(node))
    {
        for (const auto& child : control->children())
        {
            if (findTreeNodeRecursively(indent, child, name_checker))
                return true;
        }
    }
    else if (auto decorator = dynamic_cast<const DecoratorNode*>(node))
    {
        if (findTreeNodeRecursively(indent, decorator->child(), name_checker))
            return true;
    }
    return false;
}

在递归函数中return 仅从一个递归调用返回,它不会一直返回到顶部。如果这是您想要的,您必须对其进行编程。

【讨论】:

  • 行得通!非常感谢您的解释和帮助!
猜你喜欢
  • 1970-01-01
  • 2016-11-04
  • 2023-04-03
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多