我应该将什么类型的指针传递给C ++ 11中的方法?

时间:2012-02-15 15:42:36

标签: c++ pointers smart-pointers

我有两种不同的情景:

  1. 您有shared_ptr
  2. 您有unique_ptr
  3. 答案可能是相同的。

    考虑一种方法,该方法使用指针但不承担所有权:

    void use_pointer(T ptr)
    {
        ptr->act();
    }
    

    应该是

    • my_type *(原始指针)
    • const shared_ptr<my_type> &(发送const ref,如果使用shared_ptr)
    • const unique_ptr<my_type> &(发送const ref,如果使用unique_ptr)
    • weak_ptr<my_type>(为方法调用构建weak_ptr)

    还有别的吗?谢谢!

5 个答案:

答案 0 :(得分:10)

如果您不承担所有权,那么最好接受对指针的引用。如果您想表达可选性,可以使用原始指针,或者您可以使用例如boost::optional<U&>(其中U是指针类型)。

不承担所有权的函数几乎不会接受智能指针。对于智能指针接口中的被调用者而言,除了到达指针对象之外,通常没有任何用处。所以通过它。

答案 1 :(得分:5)

让来电者决定:

template<typename T>
void use_pointer(const T& ptr)
{
    ptr->act();
}

与原始指针很好地配合(如果调用者有一个具有自动或静态生命周期的数组),shared_ptrunique_ptr,以及调用者传递的所有类型的迭代器类型你是集合中的一个元素。

答案 2 :(得分:3)

在这种情况下,它应该是my_type&。如果你真的必须传递指针,那么只需传递一个原始指针:因为你在代码中使用智能指针,当有人看到原始指针时,他们不应该想“哦不,它可以泄漏!”而是“aha,一个非拥有的指针”(也就是说,假设他们熟悉惯用的C ++)。

答案 3 :(得分:0)

如果不知道为什么你有这个问题,就不可能回答这个问题 智能指针(而不是原始指针),并且不知道 被调用函数的语义,特别是它需要的原因 指针(而不是按值或通过const引用调用)。好一点 但是,如果函数采用类类型,则使用const 参考,否则,使用价值。 (但是有没有一个场景 你会指向一个不是类类型的东西?)

答案 4 :(得分:0)

如果函数要存储指针(例如添加到容器中),请使用std :: shared_ptr,otherwize使用std :: unique_ptr。如果你的指针已经是std :: shared_ptr,那么继续使用它。