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

What type of pointer should I pass to a method in C++11?

本文关键字:什么 类型 指针 方法 C++11 我应该      更新时间:2023-10-16

我想要两种不同的场景:

  1. 您有shared_ptr
  2. 您有unique_ptr

答案可能是一样的。

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

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

T应该是吗

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

还有别的吗?谢谢

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

不承担所有权的函数几乎永远不应该接受智能指针。通常,在智能指针接口中,除了获取指针对象的方法之外,对被调用者没有任何有用的东西。所以把它传过去吧。

让调用者决定:

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

可以很好地处理原始指针(例如,如果调用方有一个具有自动或静态生存期的数组)、shared_ptrunique_ptr,以及所有类型的迭代器类型(如果调用方从集合中传递一个元素)。

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

如果不知道为什么你有智能指针(而不是原始指针),并且不知道被调用函数的语义,特别是为什么它需要指针(而不是通过值或常量引用进行调用)。作为一件好事然而,起点是:如果函数采用类类型,请使用const引用,否则使用值。(但有没有一种情况你会有一个指向非类类型的指针吗?)

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