这是传递可选/ NULL shared_ptr参数的好习惯吗?

时间:2011-12-24 10:54:29

标签: c++ shared-ptr

我是shared_ptrs的新手,并且一直在努力处理“可选”指针参数的正确方法。也就是说,如何最好地将指针参数传递给方法,其中任何一个方法在任何给定的调用中都可能为NULL。这是使用原始指针的简化示例:

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;
   }
}

method1接受指向shared_ptrs的指针,因此调用者可以传递NULL,您可以轻松地声明默认值为NULL的参数。但是,逻辑变得有点混乱,并且使用指向shared_ptrs的指针似乎是错误的。

method2要求调用者为任何“NULL”参数创建临时空的shared_ptrs。这充其量是笨重而且模糊不清。

method1是最好的方法吗?有没有更好的办法?我在这里完全错过了船吗?

1 个答案:

答案 0 :(得分:5)

传递null共享指针没有错。实际上,空共享指针是一个实际的Null Object,这意味着它的设计完全适用于那些用途。