【发布时间】:2020-07-29 11:51:00
【问题描述】:
我想要一个unique_ptr 作为类变量来支持多态性。我已经构建了类,但我不能使用 std::vector 构造函数,因为 std::unique_ptr 复制构造函数已被明确删除。这是一个抽象的例子:
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Animal {
protected:
std::string noise = "None";
public:
Animal() = default;
virtual std::string getNoise() {
return noise;
}
};
class Duck : public Animal {
public:
Duck() {
noise = "Quack!";
}
};
class Dog : public Animal {
public:
Dog() {
noise = "Woof!";
}
};
typedef std::unique_ptr<Animal> AnimalPtr;
class Zoo {
public:
AnimalPtr animalPtr;
explicit Zoo(AnimalPtr animalPtr) : animalPtr(std::move(animalPtr)){};
explicit Zoo(const Animal& animal) : animalPtr(std::make_unique<Animal>(animal)){};
const AnimalPtr &getAnimalPtr() const {
return animalPtr;
}
};
int main() {
Zoo zoo1((Dog()));
Zoo zoo2((Duck()));
std::vector<Zoo> zoos = {zoo1, zoo2}; // error, Call to implicitly-deleted copy constructor of 'const Zoo'
return 0;
};
我可以改用std::shared_ptr 来解决这个问题,但有些事情告诉我这不是允许共享所有权的正确原因。所以我的问题是解决这个问题的正确方法是什么? (即允许我构造一个std::vector 的animals。
【问题讨论】:
标签: c++ polymorphism unique-ptr