【问题标题】:using shared pointers for loading into a variable c++使用共享指针加载到变量 C++
【发布时间】:2017-11-16 19:38:30
【问题描述】:

这样做合理吗?

void MyFunc(std::shared_ptr<MyClass>* p) {
  // calculate a, b, c
  p->reset(new MyClass(a, b, c));
}

int main() {
  std::shared_ptr<MyClass> ptr;
  MyFunc(&ptr);
  // do some other work with ptr
  return 0;
}

我读到不建议使用原始指针,只建议使用智能指针,但在我的函数参数中,基本上我使用的是原始指针。这是一个不好的做法

【问题讨论】:

  • 你可以通过引用而不是指针来传递智能指针。
  • 这里还需要指针类型吗?你可以通过引用传递MyClass 吗?
  • 好吧,我试图坚持一种风格,如果函数参数发生变化,则使用指针
  • @hovo 这就是参考的用途。指针有意义的唯一情况是参数值是否可以为空。如果没有意义,则应通过引用。如果未修改,则为 const 引用。
  • @hovo 这真的是一个品味问题。 Google C++ Style Guide 中有一些我真的不同意的东西,这就是其中之一。就个人而言,我更喜欢在签名中看到引用,这样我就自动知道我不能传递空对象(nullptr)。如果我看到一个指针,虽然不是可选的,但我可以将它传递一个空值,而不会有破坏一切的风险。他们对此的欺骗推理对我来说是虚假的。

标签: c++ c++11 pointers shared-ptr smart-pointers


【解决方案1】:

更合适的方法是:

std::shared_ptr<MyClass> MyFunc()
{
  // calculate a, b, c
  return std::make_shared<MyClass>(a, b, c);
}

这样更易读,代码更短更简洁:

int main() 
{
  auto ptr = MyFunc();
  // do some other work with ptr
  return 0;
}

如果可能的话,读者应该清楚函数的意图是什么,只是查看它的名称、参数和返回类型。在您的情况下,问题太多了:

- why do I need to pass `std::shared_ptr` to the function?
- what will happen when that ptr is equal to `nullptr`?
- will this function use object passed in `std::shared_ptr` if it points to one?

当它返回std::shared_ptr 时,这个问题不存在。 “函数在内部创建对象并返回共享所有权”——这对于每个只关注函数签名的 C++ 程序员来说都是清楚的。

【讨论】:

    【解决方案2】:

    很少有充分的理由逐个指针传递智能指针。而是通过引用传递它:

    void MyFunc(std::shared_ptr<MyClass>& p)
    {
        // calculate a, b, c
        p.reset(new MyClass(a, b, c));
    }
    
    int main()
    {
        std::shared_ptr<MyClass> ptr;
        MyFunc(ptr);
        // do some other work with ptr
        return 0;
    }
    

    或者,在本例中,只需更改函数以将其传入返回值而不是输出参数:

    std::shared_ptr<MyClass> MyFunc()
    {
        // calculate a, b, c
        return std::shared_ptr<MyClass>(new MyClass(a, b, c));
        // or:
        // return std::make_shared<MyClass>(a, b, c);
    }
    
    int main()
    {
        std::shared_ptr<MyClass> ptr = MyFunc();
        // do some other work with ptr
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      如果我们假设两件事:

      1. 您希望遵循 Google C++ 样式指南的建议,即输出参数应该是指针,
      2. p 是输出参数或输入/输出参数,不能作为函数的返回值。

      我会说这是有道理的。

      建议优先使用智能指针而不是原始指针,以使所有权更清晰,更不容易出错。但是在这里,您使用原始指针代替引用,并且引用不是问题。因此,这对我来说似乎是合理的,尤其是原始指针的使用仅限于“手工”引用的情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-21
        • 2019-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多