C++ 在while循环中实现重试

C++ 在while循环中实现重试,c++,while-loop,C++,While Loop,我试图在while循环中实现重试。我想重试5次,如果该标志变为真 bool flag = false; unsigned int count = 5; while(!flag && count > 0) { DataOperation opt = DataUser::Insert(data_point); if(opt == DataOperation::DataEnum) { UserPointData exist = DataUser::

我试图在while循环中实现重试。我想重试5次,如果该标志变为真

bool flag = false;
unsigned int count = 5;
while(!flag && count > 0) {
    DataOperation opt = DataUser::Insert(data_point);
    if(opt == DataOperation::DataEnum) {
        UserPointData exist = DataUser::FindUser(data_point->user_id());
        if(exist) {
           exist->attributeData.put(key, value, len_value, client_id, last_modified_date);
            flag = true;
        }
    } else {
        // insert in data_point
        data_point->attributeData.put(key, value, len_value, client_id, last_modified_date);
        flag = true;
    }
    count--;
}
  • 所以,如果标志变为true,那么我将退出循环
  • 第二种情况,若标志为false达5次,那个么我也将退出循环

我所做的看起来正确吗?

正如@Borgeader所指出的,
标志
变量是不必要的。您可以坚持使用
break
指令,并在循环结束后检查计数是否仍然大于零。如果是,则表示您的任务成功

unsigned int count = 5;
while(count > 0) {
    DataOperation opt = DataUser::Insert(data_point);
    if(opt == DataOperation::DataEnum) {
        UserPointData exist = DataUser::FindUser(data_point->user_id());
        if(exist) {
           exist->attributeData.put(key, value, len_value, client_id, last_modified_date);
            break; // success.
        }
    } else {
        // insert in data_point
        data_point->attributeData.put(key, value, len_value, client_id, last_modified_date);
        break; // success.
    }
    count--;
}

if (count > 0) { /* succeeded within 5 tries. */ }

我唯一能做的改变就是

if(opt == DataOperation::DataEnum) {
    UserPointData exist = DataUser::FindUser(data_point->user_id());
    if(exist) {
       exist->attributeData.put(key, value, len_value, client_id, last_modified_date);
        flag = true;
    } else {
      count--;
    }
我不喜欢你把count设置为5,然后倒计时,因为如果你一直递增直到达到5,这会更明显,但这会起作用


您可能希望
中断
而不是设置标志,除非您计划使用标志来区分查找匹配项还是由于条件而退出。

如果您仅为此目的使用
计数
变量,我建议您使用for循环,这样
count
将不可见,退出循环范围后将回收其内存。并使用
break
语句立即退出循环

for(auto count = 0; count<5; ++count) {
    DataOperation opt = DataUser::Insert(data_point);
    if(opt == DataOperation::DataEnum) {
        UserPointData exist = DataUser::FindUser(data_point->user_id());
        if(exist) {
           exist->attributeData.put(key, value, len_value, client_id, last_modified_date);
            break;
        }
    } else {
        // insert in data_point
        data_point->attributeData.put(key, value, len_value, client_id, last_modified_date);
        break;
    }
}
for(自动计数=0;countuser_id());
如果(存在){
exist->attributeData.put(键、值、长度值、客户端id、上次修改日期);
打破
}
}否则{
//插入数据点
数据点->属性数据放置(键、值、长度值、客户id、上次修改日期);
打破
}
}

您正在做的事情看起来不错,但可能比需要的更复杂

例如,您不需要设置退出标志,只需调用
break

以下是我有时使用的一种可能更简单的模式:

bool succeed_at_doing_stuff()
{
    std::cout << "trying" << '\n';
    return false;
}

int main()
{
    int retries = 3;

    while(retries--) // will exit when retries == 0, retries then becomes -1
    {
        if(succeed_at_doing_stuff())
            break; // no need to set a flag

        // take alternative action
    }

    if(retries < 0) // retries was decremented after last check
    {
        std::cerr << "error: gave up - too many retries" << std::endl;
        return 1;
    }
}
bool success\u at\u doing\u stuff()
{

std::cout不必将标志设置为true,只需
break;
在循环之外即可。