将 std::unique_ptr 转换为 std::unique_ptr 转换为超类的正确方法是什么?
What is the correct way to convert a std::unique_ptr to a std::unique_ptr to a superclass?
假设我有一个名为foo
的类,它继承自一个名为bar
的类。
我有一个foo
实例的std::unique_ptr
,我想将其传递给一个只需要std::unique_ptr<bar>
的函数。如何转换指针使其在我的函数中工作?
您可以将std::unique_ptr<foo>
右值转换为std::unique_ptr<bar>
:
std::unique_ptr<foo> f(new foo);
std::unique_ptr<bar> b(std::move(f));
显然,指针将由b
拥有,如果b
被销毁,bar
需要一个virtual
析构函数。
由于继承,不需要任何特殊内容。 您需要使用 std::move
将unique_ptr传递给函数,但即使类型匹配也是如此:
#include <memory>
struct A {
};
struct B : A {
};
static void f(std::unique_ptr<A>)
{
}
int main(int,char**)
{
std::unique_ptr<B> b_ptr(new B);
f(std::move(b_ptr));
}
以下语法:
std::unique_ptr<parent> parentptr = std::unique_ptr<child>(childptr);
或者您可以使用std::move
.
另一种选择是发出原始指针,但您需要更改一个函数:
void func(const parent* ptr)
{
// actions...
}
func(*childptr);
这是一篇关于智能指针并将其传递给函数的好文章:http://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters。
,因为它会违反最基本的unique_ptr
规则:必须只有一个实例保存给定的指针,并且unique_ptr
拥有它的完全所有权(当它超出范围时,点将被删除(。
如您所见,unique_ptr<T>
和unique_ptr<U>
(U : T
(不兼容。
对于可以有多个实例的shared_ptr
,有std::static_pointer_cast
的行为就像static_cast
,除了它接受一个shared_ptr
并返回另一个(并且两者都指向同一个对象(。
如果你绝对需要使用unique_ptr
,你必须创建一个函数,该函数首先取消你当前的unique_ptr
,并将该指针放入正确类型的新指针中。您可能还需要在函数调用后执行相反的转换。
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 从const ptr*转换为ptr*时出现问题
- C++ 类型转换基础 PTR 到派生 PTR 保存在引用类中
- 将 lamba 隐式转换为函数 ptr 以创建类
- 为什么非常量ptr不能隐式地将ptr转换为常量作为模板中的参数
- C++双PTR到长PTR转换
- 无法将 Uchar PTR 转换为 OpenCVsharp
- 不能动态强制转换为ptr
- 函数PTR转换为带模板参数的函数
- 将派生类的ptr类型转换为ptr类型
- 将输入字符串转换为字符* <错误 Ptr>