簡體   English   中英

使用if語句卡住代碼

[英]Stuck with code using if statements

這可能是一個無稽之談,但我有點困惑,所以我想知道是否有人可以提供幫助。 我有以下代碼:

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避免使用else if特定的代碼,因此, 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 :: list。 這樣做的代碼可能看起來像這樣

    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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM