萌新求助,这段代码要怎么优化?

2018-09-29 09:38:52 +08:00
 zynlp
class A{
private:
    void* some_ptr_;
public:
    A() :some_ptr_(nullptr){}

    bool Init(void* some_param){
        // init some_ptr_
        return true;
    }

    void Foo1(){
        if (some_ptr_ == nullptr){
            // print error
        }
        // do something
    }

    // Foo2

    // Foo3
};

每个成员函数都要检查一遍成员指针是不是空,感觉太冗余了,怎么改?

3103 次点击
所在节点    C
11 条回复
Damon4V
2018-09-29 09:42:02 +08:00
用智能指针
owenliang
2018-09-29 09:48:36 +08:00
技术上没有什么手段吧,从整体设计上改造一下?
dilu
2018-09-29 09:53:31 +08:00
我有点飘了 一个拍黄片的竟然敢到 C++的接点来回答问题

而且还不会 (手动狗头)
innoink
2018-09-29 10:03:36 +08:00
要么用引用
要么构造函数不允许用 nullptr,同时删掉 init
ipwx
2018-09-29 10:04:51 +08:00
一般这种时候我都会把责任上移。

也就是说,上一层检查 A* 是否为 nullptr,而 A* 只接受非空指针。
innoink
2018-09-29 10:04:53 +08:00
如果说空指针 100%意味着错误,那么就直接不要让这种情况构造出来
felixlong
2018-09-29 10:51:25 +08:00
为什么你认为这样的判断要优化?优化应该先找出真正需要优化的地方。
GeruzoniAnsasu
2018-09-29 10:56:51 +08:00
想办法改成 RAII,不要过早创建对象,让对象在资源被获取的那一刻才存在

首先想办法去掉 Init,在初始化的地方用显式带参数的构造函数
explicit A::A(void* p):some_ptr(p)
{
if(!p) throw std::runtime_error;
}
如果初始化的地方构造临时对象不符合生命周期,用 unique_ptr 包裹一下

void SomeClassUsingA::someFuncInitA(){ this->pa_ = std::unique_ptr<A>(new A(the_ptr)); }
void SomeClassUsingA::someFuncReleaseA(){this -> pa_ = nullptr;}

以此可以保证这个指针在生命周期内一定有效,释放指针的时间也一定符合预期的生命周期
devxp
2018-09-29 13:52:15 +08:00
我有点飘了 一个前端的竟然敢到 C++的接点来回答问题,第一感觉不应该先优化一下缩进嘛 [手动滑稽]
liuminghao233
2018-09-29 14:30:07 +08:00
删掉无意义的构造函数即可
FrankHB
2018-10-05 11:45:34 +08:00
没事搞什么劳什子两段初始化,直接存引用会死?要 nullable 就 optional,要擦除类型就 any,搞什么 void*。(啥,上不起 C 艹 17,没得用?抄总会吧: https://github.com/FrankHB/YSLib/tree/master/YBase/include/ystdex
顺便,没搞清 const noexcept 和 lambda 以外{前不换行的一起打死。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/493724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX