繁体   English   中英

使用 unique_ptr 时调用隐式删除的复制构造函数 c++ 17

[英]call to implicitly-deleted copy constructor while using unique_ptr c++ 17

我有以下设置:

class A {
public:
    constexpr A() = default;
    virtual ~A() = default;

    virtual void print() const noexcept = 0;
    virtual std::unique_ptr<A> clone() const noexcept = 0;
};

class B : public A {
public:
    constexpr B() {};
    B(const A& a1, const A& a2) : ptr1(a1.clone()), ptr2(a2.clone()) {}

    virtual ~B() = default;

    virtual void print() const noexcept override {
        std::cout << "In B\n";
    }

    void printPtrs() const noexcept {
        ptr1->print();
        ptr2->print();
    }

    virtual std::unique_ptr<A> clone() const noexcept override {
        return std::make_unique<B>(*this);
    }

private:
    std::unique_ptr<A> ptr1;
    std::unique_ptr<A> ptr2;
};

class C : public A {
public:
    constexpr C() = default;
    virtual ~C() = default;

    virtual void print() const noexcept override {
        std::cout << "In C\n";
    }

    virtual std::unique_ptr<A> clone() const noexcept override {
        return std::make_unique<C>(*this);
    }
};

===== MAIN =============
#include "MyClass.h"

#include <vector>
#include <string>
#include <memory>

using namespace std;

int main()
{
    C c;
    B b;
    B B_container(b, c);
    B_container.printPtrs();

    return 0;
}

我使用了 'clone()' 方法,采纳了这个问题的建议: Abstract class and unique pointer

我收到此错误:调用“B”的隐式删除复制构造函数我真的很纠结,我不明白为什么要在这里调用此复制构造函数? 有什么解决方法吗?

B::clone尝试复制B object,但B由于其std::unique_ptr成员而不可复制。

由于您有一个构造函数接受对A对象的两个引用并克隆它们,因此您可以改用它:

virtual std::unique_ptr<A> clone() const noexcept override {
    return std::make_unique<B>(*ptr1, *ptr2);
}

这将创建一个新的B object,它保存指向this对象的unique_ptr成员所指向的A对象副本的指针,而不是尝试复制unique_ptr本身,这是您无法做到的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM