矢量地图的实现

时间:2014-12-15 17:31:18

标签: c++ oop dictionary vector polymorphism

我需要帮助开始这项任务。我有一个基类Shape,派生类MyCircleMyRectMyTriangle。 对于赋值,我需要随机生成形状并将它们存储到地图中。 这是我不明白的。它指出:地图中的键值将是形状类型,映射的值将是Shape指针的矢量。

我创建了Shape指针的向量,如下所示:

// define our array size
const int baseSize = 3;

// create an vector of base class pointers
vector <Shape *> baseShape(baseSize);


// declare our objects, and pointers for downcasting
MyRect rObj, *rPtr;
MyTriangle tObj, *tPtr;
MyCircle cObj, *cPtr;


// initialize our vector of base class pointers
//initialize vector of shapes
baseShape[0] = &rObj; // a MyRect IS A Shape
baseShape[1] = &tObj;   // a MyTriangle IS A Shape
baseShape[2] = &cObj; // a MyCircle IS A Shape

但我不确定如何实现地图,更具体地说,我不明白为什么键值类型是Shape。 如果我按照以下方式宣布地图

//map
map <Shape, vector <Shape *> > shapeMap;

地图可以这样做吗?

shapeMap[rObj] = baseShape[0];
shapeMap[rObj] = baseShape[0];
shapeMap[rObj] = baseShape[0];
shapeMap[rObj] = baseShape[0];

... 每种形状20次,具有不同属性的形状。

enter image description here

2 个答案:

答案 0 :(得分:1)

我的解释是,对于形状类型,您可以创建类型的枚举,并将其用作关键字。

enum class ShapeType { circle, square, triangle };

map<ShapeType, vector<Shape*>> shapes;
shapes[ShapeType::circle].push_back( new MyCircle{} );

(上面的几行代码不会删除圆圈,除非这样做,否则会有内存泄漏。)

答案 1 :(得分:1)

  

地图中的键值将是形状类型

虽然我并不是100%肯定要求,但我认为这意味着你应该实现这样的枚举:

enum ShapeType {
    Circle,
    Rectangle,
    Triangle
};

并声明你的地图:

map<ShapeType, vector <Shape *> > shapeMap;