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

Is this a good idiom for passing optional/NULL shared_ptr parameters?

本文关键字:参数 ptr 好习惯 shared NULL      更新时间:2023-10-16

我是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。这是最麻烦和晦涩的。

方法1是最好的方法吗?有没有更好的办法?我是不是完全错过了机会?

传递一个空共享指针并没有错。事实上,空共享指针是一个实际的空对象,这意味着它是专门为这些用途而设计的。