2011-12-24 96 views
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是最好的方法吗?有没有更好的办法?我完全错过了这里的船吗?

+1

我不确定我是否遵循你的论点。关于传递一个临时空的'shared_ptr'有什么麻烦和晦涩的?另一方面,是不是要求'Obj'释放其中一个指针完全不同的操作,要求它共享一个新对象的所有权?如果是这样,为什么这些不同的操作有不同的功能,那么在这两种情况下调用者可以使用完全简单和清晰的函数调用? – 2011-12-24 11:05:25

+2

为了这个目的,看看Boost.optional。 – 2011-12-24 11:07:25

+0

@CharlesBailey在我看来,像方法(shared_ptr (),shared_ptr ())类似于方法(NULL,NULL)的可读性一目了然。如果我理解了一些东西,你应该使用明确的临时对象,这使得它变得更糟(我认为)。你说得很清楚,但在某些情况下,将所有参数传递到单一方法而不是单独的设置者/获取者是更合适的。 – dschultz 2011-12-24 11:29:59

回答

5

传递空共享指针没有任何问题。事实上,一个空的共享指针是一个实际的Null Object,这意味着它的设计正是为了这些用途。

相关问题