【问题标题】:implementation of vector maps矢量地图的实现
【发布时间】:2014-12-15 17:31:17
【问题描述】:

我需要帮助才能开始这项作业。我有一个基类Shape,以及派生类MyCircleMyRectMyTriangle。 对于作业,我需要随机生成形状并将它们存储到地图中。 这是我不明白的。它声明:映射中的键值将是形状类型,映射值将是形状指针的向量。

我创建了 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

但是我不确定如何实现map,更具体地说,我不明白为什么键值类型是Shape。 如果我声明一个地图如下

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

地图可以做到这一点吗?

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

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

【问题讨论】:

    标签: c++ oop dictionary vector polymorphism


    【解决方案1】:

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

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

    (上面那几行代码并没有删除圆圈,否则会出现内存泄漏。)

    【讨论】:

    • enum 更好的可能是每个具体类中的static const int ShapeType = &lt;some value&gt;。他们甚至可以从enum 中提取值,我猜(例如static const Shape::Type ShapeType = &lt;some enum Shape::Type value&gt;)...但是将类型标识符作为类的一部分而不是单独的数据集合对我来说似乎更干净...
    【解决方案2】:

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

    虽然我不能 100% 确定要求,但我认为这意味着您应该实现这样的枚举:

    enum ShapeType {
        Circle,
        Rectangle,
        Triangle
    };
    

    并像这样声明您的地图:

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

    【讨论】:

    • enum classs 是首选,除非需要与 C++98 兼容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多