使用 if 语句的代码卡住了

Stuck with code using if statements

本文关键字:代码 if 语句 使用      更新时间:2023-10-16
这可能是

一个无意义的问题,但我有点卡住了,所以我想知道是否有人可以提供帮助。我有以下代码:

bool while_condition=false;
do{
   if(/*condition*/){
      //code
   }
   else if(/*condition*/){
      //code
   }
   else if(/*condition*/){
      //code
   }
   ...//some more else if
   else{
      //code
   }
   check_for_do_while_loop(while_condition, /*other parameters*/);
}while(while_condition);

各种ifelse if相互排除,但每个if都有其他;如果满足某个条件(不能在单个 if 语句中指定),则代码返回一个值,do while循环结束。但是,如果在进入单个else if后,不满足内部条件,则代码退出而不实际执行任何操作,并且while循环重新启动整个循环。

我希望程序记住他输入的位置并避免代码的那部分,即避免他输入的特定else if没有任何结果,因此他可以尝试输入另一个else if。我想过将布尔值与语句相关联,但我不太确定如何做到这一点。有没有一种方法可以让我不过度修改代码结构?

为了说明一种避免变量负载的方法,下面概述了如何对解决方案进行数据驱动。

class TestItem
{
public:
    typedef bool (*TestFuncDef)(const state_type& state_to_test, std::shared_ptr<result_type>& result_ptr);
    TestItem(TestFuncDef test_fn_parm)
    {
        test_fn = test_fn_parm;
        already_invoked = false;
    }
    bool Invoke(const state_type& state_to_test, std::shared_ptr<result_type>& result_ptr)
    {
        already_invoked = true;
        return test_fn(state_to_test, result_ptr);
    }
    bool AlreadyInvoked() const {return already_invoked; }
private:
    TestFuncDef test_fn;
    bool already_invoked;
};

std::shared_ptr<result_type> RunTest(std::list<TestItem>& test_item_list, state_type& state_to_test)
{
    for(;;) {
        bool made_a_test = false;
        for (TestItem& item : test_item_list) {
            std::shared_ptr<result_type> result_ptr;
            if (!item.AlreadyInvoked()) {
                made_a_test = true;
                if (item.Invoke(state_to_test, result_ptr)) {
                    return result_ptr;
                }
                else
                    continue;
            }
        }
        if (!made_a_test)
            throw appropriate_exception("No conditions were matched");
    }
}

这不应该是问题的完整解决方案,但建议另一种解决方法。

此处未记录的重要步骤是构建要传递给 RunTest 的 TestItems 的 std::列表。执行此操作的代码可能如下所示

    std::list<TestItem> test_item_list;
    test_item_list.push_back(TestItem(ConditionFn1));
    test_item_list.push_back(TestItem(ConditionFn2));

ConditionFn1 的定义可能如下所示

bool ConditionFn1(const state_type& state_to_test, std::shared_ptr<result_type>& result_ptr)
{
    // Do some work
    if (....)
        return false;
    else {
        result_ptr.reset(new result_type(some_args));
        return true;
    }
}