gpt4 book ai didi

c++ - 如何将带有 unique_ptr vector 的类克隆到基类

转载 作者:搜寻专家 更新时间:2023-10-30 23:51:42 25 4
gpt4 key购买 nike

#include <iostream>
#include <memory>
#include <vector>
#include <utility>
#include <map>

class IOutput{
public:
virtual std::ostream& print(std::ostream& out) const = 0;
virtual std::unique_ptr<IOutput> clone() const = 0;
virtual ~IOutput() = default;
};

std::ostream& operator<<(std::ostream& out, const IOutput& ser) {
ser.print(out);
return out;
}

class String : public IOutput {
private:
std::string m_str;
public:
String( std::string str )
: m_str(std::move(str))
{}
std::ostream& print(std::ostream& out) const override {
out << m_str;
return out;
}
std::unique_ptr<IOutput> clone() const override { return std::make_unique<String>(*this); }
};

class List : public IOutput {
private:
std::vector<std::unique_ptr<IOutput>> m_elements;
public:
std::ostream& print(std::ostream& out) const override {

}
std::unique_ptr<IOutput> clone() const override {
return std::make_unique<List>(*this);
}
};




int main () {
String s {"string s"};
String s2 {"string s2"};
String s3 {"string s3"};
String s4 {"string s4"};


return 0;
}

错误

/usr/include/c++/7/bits/stl_construct.h:75: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = IOutput; _Dp = std::default_delete<IOutput>]’
{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我发现只有当我有 std::vector<std::unique_ptr<IOutput>> 时才会出现此错误在List .看起来我在调用 std::make_unique<List>(*this) 时正在复制该 vector 在 clone 中,这意味着它必须从该 vector 中复制每个元素,在我们的例子中 (unique_ptr) 是被禁止的。
如何解决这个问题?

最佳答案

编译器无法生成复制构造函数,因为 vector 成员是不可复制的。如果你希望支持复制,你需要自己实现,例如:

List(List const& other) : m_elements(other.m_elements.size()) {
std::transform(begin(other.m_elements), end(other.m_elements), begin(m_elements),
[](std::unique_ptr<IOutput> const& o_ptr) {
return o_ptr->clone();
}
);
}

关于c++ - 如何将带有 unique_ptr vector 的类克隆到基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53764464/

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