调用shared_ptr对象方法

ark*_*974 2 c++ smart-pointers

这似乎是一个非常愚蠢的问题,所以请耐心等待。我在程序中使用智能指针代替原始指针。建议我不要使用原始指针或尽可能混合两者。我也明白这一点。我也知道只有在必要时才应使用指针。

class Foo{
  private: int val;
  public: 
    Foo(int v) :val(v){}
    int getvalue() const { return val; }
};

std::shared_ptr<Foo> foo = std::make_shared(Foo(10));

int v;

//Option I
v=foo->getvalue();

//Option II
v=foo.get()->getvalue();
Run Code Online (Sandbox Code Playgroud)

我觉得选项 I 更正确,因为选项 II 使用原始指针。但是使用原始指针在这里可能不会造成伤害,因为我没有分配或取消分配。

我经常对这两个选项感到困惑。哪一个更可取?它们只是一样吗?谢谢。

Sto*_*ica 5

原始指针不是敌人。如果没有它们的一种形状或形式,我们就无法用 C++ 编写任何有用的程序。问题在于拥有原始指针。它们没有与其类型相关的明确的所有权语义,因此程序员需要完成手动管理生命周期的艰巨任务。如果需要,不要害怕将原始指针作为句柄传递。

这将我们引向下一点。您演示的两种方法都依赖于原始指针。重载operator-> 必须(最终)返回一个原始指针,以便我们在对象上应用成员访问。本质上,第一个版本相当于

v = foo.operator->() -> getvalue();
Run Code Online (Sandbox Code Playgroud)

它的操作与第二种形式完全相同,只是在顶部添加了语法糖。

您应该更喜欢第一种形式,因为它更短且可读。但它并没有避免原始指针,这是不可能避免的。