c++ - 您如何使用映射值?

标签 c++ oop pointers dictionary polymorphism

我有一个映射

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

然后将随机形状插入 map 。
我想对映射值使用method(Draw)。当我遍历 map 时,您该怎么做?
void RandomAttributes(Shape *shape);

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



void main()
{
    int shapes; // loop index

    // seed the random number generator
    srand((unsigned int)time(0));

    // allow the user time to move the console window away
    // from the FilledShapes window are
    cout << "Move this window to the lower right of the screen, and press ENTER to continue:\n";
    cin.get();



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

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

    // 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

    enum ShapeType {
        MyRectangle = 0,
        MyTriangle = 1,
        MyCircle = 2
    };

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


    for (int i = 0; i<PROGRAM_RUN; i++)
    {
        // clear the window
        // note that I can use ANY instance of a MyRect
        // object to clear the window
        baseShape[0]->ClearScreen();

        int rNum = rand() % 3;

        //CREATING RANDOM SHAPES
        // choose random parameters for each rectangle
        RandomAttributes(baseShape[rNum]);

        //insert shape
        shapeMap.insert(pair<ShapeType, vector <Shape *>>(ShapeType(rNum), baseShape)) ;

    }

    for (map <ShapeType, vector <Shape *> >::iterator pos = shapeMap.begin(); pos != shapeMap.end(); ++pos)
    {
       //DOES NOT WORK
        pos->second->Draw();
    }

}

我当前的实现:
    for (map <ShapeType, vector <Shape *> >::iterator pos = shapeMap.begin(); pos != shapeMap.end(); ++pos)
    {
       //DOES NOT WORK
        pos->second->Draw();
    }

}

如何遍历 map 并使用draw方法,如下所示:
我要实现的映射值如下:
//baseShape[0]->Draw();
//baseShape[1]->Draw();
//baseShape[2]->Draw();

如果我的 map 数据类型是baseShape vector 指针。

最佳答案

您提议的内容不起作用,因为pos->second不是Shape*,而是vector<Shape*>。您也必须遍历第二个:

for (map <ShapeType, vector <Shape *> >::iterator pos = shapeMap.begin(); 
     pos != shapeMap.end(); ++pos)
{
    vector<Shape*>& shapes = pos->second;

    for (size_t i = 0; i < shapes.size(); ++i) {
        shapes[i]->Draw();
    }
}

或者,如果您可以使用C++ 11:
for (auto& pr : shapeMap) {
    for (auto shape : pr.second) {
        shape->Draw();
    }
}

关于c++ - 您如何使用映射值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27495019/

相关文章:

c++ - 替代 C、C++?

c++ - 在opencv和wxwidgets之间转换图像

c++ - 加载C++库时出现“ undefined symbol ”

c# - 如何实现许多具有相同方法但做事不同的类?

PHP:覆盖子类的父类属性

C-两个指针之间的转换行为

c++ - 将 double 组转换为仅具有 double 成员的结构数组而不复制数据

java - OOP(Java)-生成对象的最佳方法

c - Typedef struct 指向函数的指针 (C)

c - 按地址传递、scanf、取消引用