我应该向C++11中的方法传递什么类型的指针
What type of pointer should I pass to a method in C++11?
我想要两种不同的场景:
- 您有
shared_ptr
- 您有
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_ptr
、unique_ptr
,以及所有类型的迭代器类型(如果调用方从集合中传递一个元素)。
在这种情况下,它可能是my_type&
。如果你真的必须传递一个指针,那么就传递一个原始指针:因为你在代码中使用智能指针,所以当有人看到原始指针时,他们不应该认为"哦,不,它可能泄漏!",而应该认为"啊哈,一个无主指针"(也就是说,假设他们熟悉惯用C++)。
如果不知道为什么你有智能指针(而不是原始指针),并且不知道被调用函数的语义,特别是为什么它需要指针(而不是通过值或常量引用进行调用)。作为一件好事然而,起点是:如果函数采用类类型,请使用const引用,否则使用值。(但有没有一种情况你会有一个指向非类类型的指针吗?)
如果函数要存储指针(例如添加到容器中),请使用std::shared_ptr,otherwize则使用std::unique_ptr。如果您的指针已经是std::shared_ptr,那么继续使用它。
相关文章:
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 当你只使用 return 时,函数返回什么类型;在 c++ 中
- 这在C++是什么类型的错误?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 重载运算符返回什么类型的值(对于用户定义的类型):右值还是左值?
- int(int)& 或 int(int) const &是什么类型?
- 它>首先给出什么类型?
- ``n = 1u;'有什么类型
- 访问和存储/解析性std :: Chrono ::持续时间:: milliseconds(cpprest)时使用什么类型
- 二进制要找到什么类型的序列化
- 我如何找出3D容器的元素是什么类型
- C++ - 函数中的局部指针变量具有什么类型的存储持续时间以及它们存储在哪里?
- 将 lambda 作为模板参数传递:实际推导出什么类型
- 在 c 和 c++ 中,二维数组的元素是什么类型?
- 什么类型会使"std::has_unique_object_representations"返回 false?
- 这个 lambda 的参数是什么类型?
- 转换逻辑目标是什么类型
- 由值持有的成员的get函数应该具有什么类型
- C++中使用什么类型来定义数组大小