c ++我可以使用std :: unique_ptr进行依赖注入吗?

时间:2011-11-01 19:39:16

标签: c++ dependency-injection c++11 unique-ptr

我一直在使用原始指针进行依赖注入,我决定将我的代码转换为使用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引用最佳解决方案吗?

1 个答案:

答案 0 :(得分: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();
   }