gpt4 book ai didi

c++ - 将导出的 std::unique_ptr 转换为基类并将所有权作为参数传递

转载 作者:行者123 更新时间:2023-12-03 07:53:12 27 4
gpt4 key购买 nike

我有这个代码:

#include <iostream>
#include <memory>

class Base
{
public:
virtual void doSmth() = 0;
};

class Der1 : Base
{
public:
void doSmth() final
{
std::cout << "Hello from der1\n";
}
};

class Der2 : Base
{
public:
void doSmth() final
{
std::cout << "Hello from der2\n";
}
};

class Owner
{
public:
Owner(std::unique_ptr<Base> passedptr)
{
ptr = std::move(passedptr);
}

std::unique_ptr<Base> ptr;
};

int main()
{
auto der = std::make_unique<Der1>();
Owner owner(std::move(der)); // Fails, need to convert
owner.ptr->doSmth();
}

我希望 Owner 类在构造函数中获取基指针,并将其 unique_ptr 成员设置为它。我知道我需要用 std::move() 传递它,但我不明白如何将它转换为基类。

我见过unique_ptr to a derived class as an argument to a function that takes a unique_ptr to a base class ,但它的解决方案似乎不起作用,我不能像在代码中那样将指针移动到派生类,而且我无法创建这样的基指针:

std::unique_ptr<Base> der(new Der1());

如何正确转换和传递所有权?

最佳答案

How can I convert and pass ownership properly?

您需要执行几个步骤才能使代码正确。

  1. 派生类应该继承 Base , public盟友,以便所有编译器生成 Base 的构造函数(即移动构造函数和移动赋值)对他们也很有用。

  2. Base类缺少虚拟析构函数,并且您正在分配子指针(即在 Owner 类中),因此将通过 Base 删除该子指针。类指针(即 std::unique_ptr<Base> ptr; )。这将导致未定义的行为。

    在此处阅读更多信息:When to use virtual destructors?

  3. Owner ,你应该更好地使用 constructor initializer list ,而不是构建 Owner并分别分配成员。

  4. (可选),您可能希望为 Owner 提供模板构造函数。 ,这样就可以同时通过 Der1Der2 .

代码如下所示:See live demo in godbolt.org


class Base
{
public:
virtual void doSmth() = 0;
virtual ~Base() = default; // add this for designed behavior!
};

class Der1 : public Base
// ^~~~~~~ ---> Inherit public ally
{
public:
// ....
};

class Der2 : public Base
// ^~~~~~~ ---> Inherit public ally
{
public:
// ....
};

class Owner
{
public:
template<typename Derived> // --> Templated
Owner(std::unique_ptr<Derived>&& passedptr)
: ptr(std::move(passedptr))
{}

std::unique_ptr<Base> ptr;
};

关于c++ - 将导出的 std::unique_ptr 转换为基类并将所有权作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76639505/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com