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
};
每个成员函数都要检查一遍成员指针是不是空,感觉太冗余了,怎么改?
1
Damon4V 2018-09-29 09:42:02 +08:00
用智能指针
|
2
owenliang 2018-09-29 09:48:36 +08:00
技术上没有什么手段吧,从整体设计上改造一下?
|
3
dilu 2018-09-29 09:53:31 +08:00
我有点飘了 一个拍黄片的竟然敢到 C++的接点来回答问题
而且还不会 (手动狗头) |
4
innoink 2018-09-29 10:03:36 +08:00
要么用引用
要么构造函数不允许用 nullptr,同时删掉 init |
5
ipwx 2018-09-29 10:04:51 +08:00
一般这种时候我都会把责任上移。
也就是说,上一层检查 A* 是否为 nullptr,而 A* 只接受非空指针。 |
6
innoink 2018-09-29 10:04:53 +08:00
如果说空指针 100%意味着错误,那么就直接不要让这种情况构造出来
|
7
felixlong 2018-09-29 10:51:25 +08:00
为什么你认为这样的判断要优化?优化应该先找出真正需要优化的地方。
|
8
GeruzoniAnsasu 2018-09-29 10:56:51 +08:00 4
想办法改成 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;} 以此可以保证这个指针在生命周期内一定有效,释放指针的时间也一定符合预期的生命周期 |
9
devxp 2018-09-29 13:52:15 +08:00
我有点飘了 一个前端的竟然敢到 C++的接点来回答问题,第一感觉不应该先优化一下缩进嘛 [手动滑稽]
|
10
liuminghao233 2018-09-29 14:30:07 +08:00 via iPhone
删掉无意义的构造函数即可
|
11
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 以外{前不换行的一起打死。 |