Это хорошая идиома для передачи необязательных параметров / NULL shared_ptr? - PullRequest
2 голосов
/ 24 декабря 2011

Я новичок в 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 требует, чтобы вызывающая сторона создала временные пустые shared_ptrs для любых аргументов «NULL».В лучшем случае это громоздко и неясно.

Является ли method1 лучшим способом?Есть ли способ лучше?Я полностью пропустил лодку здесь?

1 Ответ

5 голосов
/ 24 декабря 2011

Нет ничего плохого в передаче нулевого общего указателя. Фактически, нулевой разделяемый указатель является фактическим Нулевым объектом , что означает, что он предназначен именно для этих видов использования.

...