gpt4 book ai didi

c++ - std::unique_ptr 试图引用已删除的函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:05 25 4
gpt4 key购买 nike

我已经使用 Unity 一段时间了,然后回来使用 Visual Studio 2015 做一些 C++。我遇到了这个类定义

class A
{
public:
A();
virtual ~A();
A(const A&) = delete;
A& operator=(const A&) = delete;

private:

}

这个类是动态分配的,如下所示:

ObjPtr obj = ObjPtr(new A());

哪里ObjPtr是定义的类型,看起来像:

typedef std::unique_ptr<A> objPtr;

并将这些创建的对象添加到 std::vector<ObjPtr>使用 std::move .有一次,我需要遍历对象列表,如果我找到满足我条件的对象,请保留一份拷贝。

ObjPtr keep;

for(auto& object : GetObjectList() )
{
if(/*check if its the object I want*/)
{
keep = object;
}
}

其中 GetObjectList 返回 const std::vector<ObjPtr>& .

但我收到“试图引用已删除的函数”。我做了一些谷歌搜索并试图删除 = delete部分,甚至评论了 2 行。我什至尝试过

ObjPtr keep = std::move(object);

但我仍然收到已删除函数的错误。任何人都可以看到我做错了什么或指出一些可以提供帮助的资源吗?

最佳答案

A std::unique_ptr无法复制。即使托管对象可以(但你的不能)。

这里有几个选择(都有不同的效果):

  • 更改 keep 的类型到一个非拥有的原始指针(又名 A * )并使用 keep = object.get(); .当且仅当您知道您不会使用 keep 时,这是安全的长于 ObjectList (或者更准确地说,您获取地址的对象)存在。

  • 移动std::unique_ptr从容器中取出,即使用keep = std::move(object); .当然,现在你在 ObjectList 上有差距了. (我知道你已经编辑了你的问题,说 ObjectListconst 这意味着你不能修改,因此不能将对象移出它。)

  • 更改 ObjPtr 的类型至 std::shared_ptr<A>如果您想要共享所有权语义。

  • 如果您绝对想要对象的拷贝,您可以添加 virtual A 的成员函数以多态方式克隆对象。

    class A
    {
    public:
    virtual std::unique_ptr<A> clone() = 0;

    };

    然后您在每个叶子中实现该函数 class源自 A .在你的循环中,你然后使用 keep = object->clone(); .为此,您可能希望创建复制构造函数 protected但不要delete

    不要使用 keep = std::make_unique<A>(*object);因为它不会尊重对象的实际(动态)类型并且总是切片到 A . (因为你的 A 是不可复制的,所以它无论如何也行不通。)

关于c++ - std::unique_ptr 试图引用已删除的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33849004/

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