具有unique_ptr-s的向量
Vector with unique_ptr-s
我有这样的代码:
#include <memory>
#include <vector>
namespace daq
{
class Animal
{
public:
Animal(){};
};
class Pig : public Animal
{
public:
Pig() : Animal () {};
};
class Farm
{
public:
void addAnimal(Animal& animal)
{
mAnimals.push_back(std::unique_ptr<Animal>(animal)); // error
}
private:
std::vector<std::unique_ptr<Animal>> mAnimals;
};
} /* namespace daq */
但我得到错误的方法农场::addAnimal:
没有匹配的函数调用' std::unique_ptr::unique_ptr(daq::Animal&) '
我应该传递什么给push_back方法?
unique_ptr
接受指针作为构造函数参数,但是您传递的是引用。这基本上就是编译器告诉你的:你不能从一个daq::Animal&
构造一个std::unique_ptr
。
您可以传递一个原始指针到new
分配的Animal
类型的对象,或者(最好)您应该传递一个以这种方式构造的unique_ptr
,并在作为push_back()
的参数提供时从它移动:
void addAnimal(std::unique_ptr<Animal>&& animal)
// ^^
// This is to make it absolutely clear that
// your intention is to bind to an object
// the client wants to move from. It is not
// especially needed here (unique_ptr is not
// copyable), but it makes your interface
// more explicit about it. [Credits to sehe]
{
mAnimals.push_back(std::move(animal)); // OK
}
int main()
{
daq::Farm farm;
std::unique_ptr<daq::Animal> pig(new daq::Pig());
farm.addAnimal(std::move(pig)); // OK
}
你必须在这里使用std::move()
,因为unique_ptr
s是不可复制的,所以你有效地将pig
的所有权从调用它的例程转移到包含它的向量(addAnimal()
是这个转移的中间)。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 为共享 ptr 向量实现复制 c'tor?
- 对唯一 ptr 无效读取的引用向量
- 接口 PTR 的返回向量C++
- 如何在满足谓词的向量中获得唯一PTR的子集
- 通过成员函数将唯一 ptr 的向量附加到另一个向量
- C++ 提升克隆 PTR 向量
- PTR到结构体和PTR到结构体的向量的模板方法专门化