我无法通过智能指针正确组织事情。几乎到了我不得不重新使用普通指针。
我希望在整个程序中轻松使用智能指针,而不必每次都输入shared_ptr<...>
。我立即想到的一个解决方案是创建一个模板类并向其添加typedef sptr
,这样我就可以class Derived : public Object < Derived > ..
然后使用Derived::sptr = ...
但这显然是可怕的,因为它不起作用然后从Derived对象派生另一个类。
即使做typedef shared_ptr<..> MyObjectPtr
也很可怕,因为为了一致性,或者至少对于unique_ptr和shared_ptr,它需要为每种智能指针完成。
那么人们使用智能指针的标准方式是什么?因为坦率地说,我开始认为使用它们太麻烦了。 :/
答案 0 :(得分:2)
那么人们使用智能指针的标准方式是什么?
很少。您发现使用它们很麻烦的事实表明您过度使用指针。尝试重构代码,使指针成为异常,而不是规则。 shared_ptr
特别有其利基,但它是一个小的:即,当你真正必须在几个对象之间共享资源的所有权时。这是一种罕见的情况。
因为坦率地说我开始认为使用它们太麻烦了。 :/
同意。这是不使用指针的主要原因。
还有更多方法可以避免指针。特别是,shared_ptr
实际上只需要在实际需要传递所有权时拼写出来。在不处理所有权的函数中,您不会传递shared_ptr
或原始指针;你会传递一个引用,并在调用函数时取消引用指针。
里面的函数你几乎不需要拼出这个类型;例如,您可以(而且应该)简单地说auto x = …;
而不是shared_ptr<Class> x = …;
来初始化变量。
总结,您只需要在代码中的极少数地方拼出shared_ptr
。
答案 1 :(得分:0)
我有很多动态创建对象的代码。因此,使用指针是必要的,因为从一开始就不知道对象的数量。在一个子系统中创建一个对象,然后将其存储在另一个子系统中,然后将其传递给创建它的子系统进一步处理。所以我想这意味着使用shared_ptr。好的设计?我不知道,但要求子系统创建它拥有的具体对象似乎最合乎逻辑,返回指向该对象的接口的指针,然后将其传递给另一段将与该对象交互的代码通过它的抽象界面。
我可以从工厂方法返回unique_ptr。但是如果我需要多次传递对象进行处理,那么我会遇到麻烦。因为在将对象传递给另一个方法之后我仍然需要知道对象,而unique_ptr意味着在执行move()之后我会丢失对象的跟踪。由于我需要至少有两个对象的引用,这意味着使用shared_ptr。
我听说最常用的智能指针是unique_ptr。我的申请当然不是这样。我最终经常使用shared_ptr。这是不好的设计标志吗?