假定接口需要返回一个指针,且可能涉及某些条件判断,不一定能获取到有效指针,大部分人写法如下:
// 根据条件判断是否返回有效值
Pointer* GetPtr(void)
{
if(xxx1)
return nullptr;
if(xxx2)
return nullptr;
if(xxx3)
return new Pointer();
return nullptr;
}
之后为了代码严谨,会有以下操作:
Pointer* pPtr = GetPtr();
if(pPtr == nullptr) // 很多地方调用GetPtr接口的话,到处都需要对返回指针进行判断,很臃肿
{
return;
}
// todo
相对来说,代码会比较繁琐,建议对代码进行调整如下:
// 当需要返回值时,接口尽可能别在多个位置使用return
// 直接对接口返回值判断,如果返回真,则可判定pPtr为有效指针,直接使用
bool GetPtr(_Out_ Pointer** pPtr) // 当然也可以换成指针的引用
{
bool bRet = false;
for( ; ; )
{
if(xxx1)
break;
if(xxx2)
break;
bRet = true;
*pPtr = new Pointer();
break;// 注意跳出
}
return bRet;
}
或者
bool GetPtr(_Out_ Pointer** pPtr)
{
bool bRet = false;
do{
if(xxx1)
break;
if(xxx2)
break;
bRet = true;
*pPtr = new Pointer();
// 可以不用break
}while(0);
return bRet;
}
调用接口如下
Pointer* pPtr = nullptr;
if(GetPtr(&pPtr))
{
// todo
}
或者
if(!GetPtr(&pPtr))
{
return;
}
// todo