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_ptrwith references 是最好的解决方案吗?

4

1 回答 1

4

您可以将 unique_ptr 传递给另一个类,而另一个类只是“使用”指针(不拥有它??)?

在这种情况下,将指针更改为 reference :

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 回答