我需要一个多态的对象集映射,这需要一个映射到指针以避免slicing。由于我希望将值对象的生命周期与地图对象的生命周期联系起来,我想使用unique_ptr
。
这引出了以下结构:
#include <memory>
#include <string>
#include <map>
#include <vector>
struct Shape {
virtual double area() const = 0;
virtual ~Shape() {};
};
struct Square : public Shape {
double a;
Square(double a) { this->a = a; };
double area() const { return a*a; };
};
typedef std::map<std::string, std::unique_ptr<Shape>> ShapeMap;
// Creating an instance of ShapeMap with a factory is ok:
ShapeMap buildShapeMap() {
ShapeMap m;
m.emplace("square1", std::make_unique<Square>(2));
return m;
}
ShapeMap m1 = buildShapeMap();
但是,我真正想做的是静态构造函数:
/* Fails: std::pair<const _Kty,_Ty>::pair(const std::pair<const _Kty,_Ty> &)': attempting to reference a deleted function
ShapeMap m2{
{ "square1", std::make_unique<Square>(2) }
};
*/
我认为移动语义在某种程度上是不同的 - 但它是我可以解决的问题,还是我应该坚持使用工厂方法?
作为后续问题:我是否应该期待以下类似问题?
struct World {
std::string name;
ShapeMap shapes;
World(std::string const &name, ShapeMap &shapes) : name(name), shapes{ shapes } {
};
};
World world1{
ShapeMap{
{ "square2", std::make_unique<Square>(3) }
}
};