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