【发布时间】:2011-11-01 19:39:15
【问题描述】:
我一直在使用原始指针进行依赖注入,因此我决定将我的代码转换为使用 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 和引用是最佳解决方案吗?
【问题讨论】:
-
调用唯一指针的
get()成员函数。 -
根据您的更新:是的,这将是
std::unique_ptr的用例。但是在这种情况下,这个指针仍然不需要是类的成员变量,如果它只需要在DoIt中。您可以将其设为本地std::unique_ptr,并具有动态分配的存储空间。这样,由于std::unique_ptrs 智能销毁设施,对象会在您离开函数后立即销毁。 -
我同意克里斯蒂安的观点。除非您想以某种方式在多次调用中缓存服务,否则您的 unique_ptr 应该具有尽可能小的范围——这里是 DoIt 的范围。
-
@BartoszMilewski:同意。实际上,在我的代码中,我需要跨多个调用的服务。在这里,我试图使示例保持较小。
标签: c++ dependency-injection c++11 unique-ptr