2025年实战c++中的智能指针unique_ptr系列-- 使用unique_ptr来避免if多层嵌套

实战c++中的智能指针unique_ptr系列-- 使用unique_ptr来避免if多层嵌套博文引用连接 http www jianshu com p 9898abc55677 今天看到这个文章 觉得没有很 nice 我们太喜欢流程控制了 在程序中写了太多的 if else 也许我们对于逻辑非常的清晰 但是对于阅读你代码的人来说就是一场灾难 很多人都说使用多态来避免过多的 if

大家好,我是讯享网,很高兴认识大家。

今天看到这个文章,觉得没有很nice。

我们太喜欢流程控制了,在程序中写了太多的if else

也许我们对于逻辑非常的清晰,但是对于阅读你代码的人来说就是一场灾难。

很多人都说使用多态来避免过多的if else嵌套,但是有时候你会觉得新写一个类似乎有点小题大做,尤其在整个代码已经庞大的时候。

还有人说,可以把if else语句转换为switch语句,这样也可以适当的避免多层的if嵌套。


讯享网

 auto pa = CreateA(); status = doStuffByA(pa); auto pb = CreateBbyA(pa); status = doStuffByB(pb);

讯享网

就像上面这段代码,正常的逻辑很简单,但是如果考虑到错误处理的话,代码就变得异常麻烦了。

下面这段代码单纯的依靠if-else处理问题,可以看到代码嵌套很严重,而且在很多地方都需要调用DestoryA(pa);,都是重复的逻辑。

讯享网bool Init(){ A* pa = nullptr; B* pb = nullptr; pa = CreateA(); if (pa) { if (doStuffByA(pa)) { pb = CreateBbyA(pa); if (pb) { if (doStuffByB(pb)) { } else { DestoryB(pb); DestoryA(pa); return false; } } else { DestoryA(pa); return false; } } else { DestoryA(pa); return false; } } else{ return false; } return true; }

C++11下,我们有了利器unique_ptr

bool Init4() { auto deleterA = [&](A* p){ if (p) DestoryA(p); }; std::unique_ptr<A, decltype(deleterA)> pa(CreateA(),deleterA); if (!pa){ return false; } if (doStuffByA(pa.get())){ return false; } auto deleterB = [&](B* p){ if (p) DestoryB(p); }; std::unique_ptr<B, decltype(deleterB)> pb(CreateBbyA(pa.get()), deleterB); if (!pb){ return false; } if (doStuffByB(pb.get())){ return false; } pa.release(); pb.release(); return true; }

上面的代码也是出自连接:http://www.jianshu.com/p/9898abc55677

有了前面的基础,读懂很容易吧:
pa pb均为具有自定义删除器的智能指针;
定义删除器用到了lambda表达式;
使用了unique_ptr的get()方法来 Returns the stored pointer.

小讯
上一篇 2025-03-14 13:06
下一篇 2025-02-17 22:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/58788.html