![](/img/trans.png)
[英]vector<unique_ptr<A> > in constructor - error: call to implicitly-deleted copy constructor
[英]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.