【问题标题】:What type of pointer should I pass to a method in C++11?我应该将什么类型的指针传递给 C++11 中的方法?
【发布时间】:2012-02-15 15:42:35
【问题描述】:

我追求两种不同的场景:

  1. 你有一个shared_ptr
  2. 你有一个unique_ptr

答案可能是一样的。

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

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)

还有什么?谢谢!

【问题讨论】:

    标签: c++ pointers smart-pointers


    【解决方案1】:

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

    不假定所有权的函数几乎不应该接受智能指针。通常,智能指针接口中的被调用者除了到达被指点的方法之外没有任何用处。所以改为传递它。

    【讨论】:

    • 方便的是,如果您接受引用,则所有指针类型的调用语法都相同:use_pointer(*ptr)
    【解决方案2】:

    让调用者决定:

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

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

    【讨论】:

    • 这是一个好主意,当我在问题中写下“占位符”T 时,实际上就想到了它......但接受了另一个,因为这作为一般情况有点麻烦事物的类型。
    • @Max:我也很喜欢 Luc 的解决方案——但前提是参数是 const 引用。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      不知道你为什么有一个问题是不可能回答这个问题的 智能指针(而不是原始指针),并且不知道 被调用函数的语义,特别是为什么它需要一个 指针(而不是按值或 const 引用调用)。作为一个好 但是,起点:如果函数采用类类型,请使用 const 参考,否则,使用价值。 (但是有没有一种情况 你会有一个指向非类类型的指针吗?)

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-01
          • 2012-12-11
          • 1970-01-01
          • 2021-02-12
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多