2
我是shared_ptrs的新手,一直在努力处理“可选”指针参数的正确方法。也就是说,如何将指针参数传递给方法,其中任何一个方法在任何给定的调用中都可能为NULL。这里有一个简单的例子使用原始指针:这是传递可选/ NULL shared_ptr参数的好习惯吗?
class Obj {
SomeType *ptrA;
SomeType *ptrB;
...
void method(SomeType* a, SomeType* b) {
ptrA = a;
ptrB = b;
}
}
现在切换到shared_ptrs:
class Obj {
shared_ptr<SomeType> ptrA;
shared_ptr<SomeType> ptrB;
// Option 1: pointers to shared pointers:
void method1(shared_ptr<SomeType>* a, shared_ptr<SomeType>* b) {
if (a) ptrA = *a;
else ptrA.reset();
// repeat for b
}
// Option 2: pass empty shared_ptrs as analog for NULL
void method2(shared_ptr<SomeType> a, shared_ptr<SomeType> b) {
ptrA = a;
ptrB = b;
}
}
方法1采用指针shared_ptrs使呼叫者可以传递NULL,你可以很容易地用默认设置为NULL值声明参数。然而,逻辑有点混乱,使用指向shared_ptrs的指针似乎是错误的。
method2要求调用者为任何“NULL”参数创建临时空的shared_ptrs。这很麻烦并且最好模糊。
方法1是最好的方法吗?有没有更好的办法?我完全错过了这里的船吗?
我不确定我是否遵循你的论点。关于传递一个临时空的'shared_ptr'有什么麻烦和晦涩的?另一方面,是不是要求'Obj'释放其中一个指针完全不同的操作,要求它共享一个新对象的所有权?如果是这样,为什么这些不同的操作有不同的功能,那么在这两种情况下调用者可以使用完全简单和清晰的函数调用? – 2011-12-24 11:05:25
为了这个目的,看看Boost.optional。 – 2011-12-24 11:07:25
@CharlesBailey在我看来,像方法(shared_ptr(),shared_ptr ())类似于方法(NULL,NULL)的可读性一目了然。如果我理解了一些东西,你应该使用明确的临时对象,这使得它变得更糟(我认为)。你说得很清楚,但在某些情况下,将所有参数传递到单一方法而不是单独的设置者/获取者是更合适的。 –
dschultz
2011-12-24 11:29:59