unique_ptr 到派生的 class 作为函数的参数,该函数接受 unique_ptr 到基数 class 并取得所有权
unique_ptr to a derived class as an argument to a function that takes a unique_ptr to a base class and take owenership
我已经在堆栈溢出上阅读了与此问题类似的各种评论,但没有找到我的问题的确切解决方案。
我有一个 Base class 和 Derived class 还有一个 class 包含并保留此对象的所有权。
class Base { };
class Derived: public Base { };
class MyClass
{
std::vector<std::unique_ptr<Base>> myVector;
public:
MyClass() {}
void addElement (std::unique_ptr<Base> &base)
{
myVector.push_back(std::move(base));
}
};
当我尝试在 class 中添加派生对象时,我的代码无法编译。
MyClass myClass;
auto b = std::make_unique<Base>();
myClass.addElement(b);
auto d = std::make_unique<Derived>();
myClass.addElement (d); // <-- ERROR: error: cannot convert ‘std::unique_ptr >’ to ‘std::unique_ptr&’
该函数必须按值接受 unique_ptr
:
void addElement (std::unique_ptr<Base> base)
{
myVector.push_back(std::move(base));
}
然后像这样调用成员函数:
MyClass myClass;
auto b = std::make_unique<Base>();
myClass.addElement(std::move(b));
auto d = std::make_unique<Derived>();
myClass.addElement(std::move(d));
或者更好地避免使用变量,因为在函数调用之后无论如何都不能使用它们:
MyClass myClass;
myClass.addElement(std::make_unique<Base>());
myClass.addElement(std::make_unique<Derived>());
我已经在堆栈溢出上阅读了与此问题类似的各种评论,但没有找到我的问题的确切解决方案。 我有一个 Base class 和 Derived class 还有一个 class 包含并保留此对象的所有权。
class Base { };
class Derived: public Base { };
class MyClass
{
std::vector<std::unique_ptr<Base>> myVector;
public:
MyClass() {}
void addElement (std::unique_ptr<Base> &base)
{
myVector.push_back(std::move(base));
}
};
当我尝试在 class 中添加派生对象时,我的代码无法编译。
MyClass myClass;
auto b = std::make_unique<Base>();
myClass.addElement(b);
auto d = std::make_unique<Derived>();
myClass.addElement (d); // <-- ERROR: error: cannot convert ‘std::unique_ptr >’ to ‘std::unique_ptr&’
该函数必须按值接受 unique_ptr
:
void addElement (std::unique_ptr<Base> base)
{
myVector.push_back(std::move(base));
}
然后像这样调用成员函数:
MyClass myClass;
auto b = std::make_unique<Base>();
myClass.addElement(std::move(b));
auto d = std::make_unique<Derived>();
myClass.addElement(std::move(d));
或者更好地避免使用变量,因为在函数调用之后无论如何都不能使用它们:
MyClass myClass;
myClass.addElement(std::make_unique<Base>());
myClass.addElement(std::make_unique<Derived>());