C++ 在while循环中实现重试
我试图在while循环中实现重试。我想重试5次,如果该标志变为真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::
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;
在循环之外即可。