do-while的一种另类用法

设想场景,在一个函数的定义中。如果创建了一个对象(new的),在以后的操作中如果出现了异常我们需要释放该对象,返回false;反之释放对象,返回true
我们一般写法如下:

 1 bool doWork
 2 { 
 3  int *p = new int;
 4  bool isOk = true;
 5  isOk = fun1();
 6  if(!isOk)
 7  {
 8   delete p;
 9   p = null;
10   return isOk;
11  }
12  isOk = fun2();
13  if(!isOk)
14  {
15   delete p;
16   p = null;
17   return isOk;
18  }
19  isOk = fun3();
20  if(!isOk)
21  {
22   delete p;
23   p = null;
24   return isOk;
25  }
26  
27   delete p;
28   p = null;
29   return isOk;
30 }


啊哦,delete p; p = null; return isOk; 这三句话我们写了4遍,有好办法让代码简短写吗?看看下面

 1 bool doWork()
 2 {
 3  int *p = new int;
 4  bool isOk = true;
 5  do
 6  { 
 7   isOk = fun1();
 8   if(!isOk) break;
 9   isOk = fun2();
10   if(!isOk) brrak;
11   isOk = fun3();
12   if(!isOk) break;
13  }while(0);
14  
15  delete p;
16  p = null;
17  return isOk;
18 }

搞定,其实这种用法的妙处在于,使用do-while时我们没有着重使用它的循环功能,而是使用循环体中的break功能。
ps;为什么突然研究do while呢。最近在学习cocos2d-x发现在init场景时人们都喜欢把代码放到 do while(0)中,仔细想了想,又百度了一下,发现了原因。

posted @ 2013-03-26 09:57  sirYoung  阅读(209)  评论(0编辑  收藏  举报