4

私は生のポインターを使用して依存性注入を行っていましたが、shared_ptrを使用するようにコードを変換することにしました。これは機能しますが、代わりにunique_ptrを使用できるかどうか疑問に思っていますか?以下の私の例では、MyClassがクレジットカードサービスの存続期間を管理します。

class PaymentProcessor
{
    PaymentProcessor(?? creditCardService):
      :creditCardService_(creditCardService)
      {

      }

private:
   CreditCardService *creditCardService_;     
}

class MyClass
{ 
public:
   void DoIt()
   {
     creditCardService_.reset(new VisaCardService());
     PaymentProcessor pp(creditCardService_);
     pp.ProcessPayment();
   }

private:   
   std::unique_ptr<CreditCardService> creditCardService_;
}

他のクラスがポインタを(所有せずに)単に「使用」している別のクラスにunique_ptrを渡すことはできますか?もしそうなら、これは良い考えであり、PaymentProcessorのコンストラクターにパラメーターのタイプを含める必要がありますか?

アップデート

上記の例では、代わりVisaCardServiceにスタックに変数を作成し、PaymentProcessorコンストラクターにこれを参照パラメーターとして使用させることができます。これは、推奨されるC++プラクティスのようです。ただし、実行時まで具体的なタイプのcreditCardService_がわからない場合(たとえば、ユーザーが実行時に使用する特定のクレジットカードサービスを選択する場合)、std::unique_ptr参照を使用して最適なソリューションを使用していますか?

4

1 に答える 1

4

他のクラスがポインタを(所有せずに)単に「使用」している別のクラスにunique_ptrを渡すことはできますか?

その場合は、ポインタを参照に変更します。

class PaymentProcessor
{
public:
    PaymentProcessor(CreditCardService & creditCardService_):
      :creditCardService_(creditCardService_)
      {
      }

private:
   CreditCardService &creditCardService_;     
};

   void DoIt()
   {
     creditCardService_.reset(new VisaCardService());
     PaymentProcessor pp(*creditCardService_);
     pp.ProcessPayment();
   }

それでもポインタを使用したい場合は、getメソッドを使用する必要があります。

class PaymentProcessor
{
public:
    PaymentProcessor(CreditCardService * creditCardService_):
      :creditCardService_(creditCardService_)
      {
      }
private:
   CreditCardService *creditCardService_;     
};

   void DoIt()
   {
     creditCardService_.reset(new VisaCardService());
     PaymentProcessor pp(creditCardService_.get());
     pp.ProcessPayment();
   }
于 2011-11-01T19:45:54.667 に答える