当我将数组换成向量时,为什么这段代码不再有效?

时间:2016-02-15 05:33:32

标签: c++ arrays vector

我为作业创建了一个简单的“菜单”,列出了可以选择调用函数的编号选项。

标题文件:

 <script>

 function myFunc()

   {

    return false;

     }

         </script>

一切都运行正常,直到我试图在数据部分中交换出menuItems数组,这样它就是一个menuItems的向量,突然间它不起作用。它似乎停在我的addMenu函数中:

#ifndef MENU
#define MENU

#include <string>
#include <vector>

const int MAXCOUNT = 20;

struct menuItem
{
    void(*func) ();
    string descript;

};

class Menu
{
private:
    //menuItem mi[MAXCOUNT];
    vector<menuItem> mi;
    int count;
    void runSelection();
public:
    Menu();
    void addMenu(char *Description, void (*f) ());
    void runMenu();
    void waitKey();
};

#endif
但是我不明白改变了什么?

2 个答案:

答案 0 :(得分:3)

我猜这是你的问题

Menu() {
     mi.resize(MAXCOUNT); // you don't have this.
}     
Menu() : mi(MAXCOUNT) { // or this
} 
vector<menuItem> mi { MAXCOUNT} ; // and clearly not this

因此

if(count < MAXCOUNT)
{
    mi[count].func = f; // this is not valid because mi has a size of 0
    count ++;
}

这是修复问题的方法(不再需要计数成员):

if (mi.size() < MAXCOUNT)
    mi.push_back({f, Description}); // this would be a fix.

或者如前所述调整矢量大小。

答案 1 :(得分:0)

问题是您正在尝试访问向量中尚未创建的元素。 std::vector开始为空,您通常会逐个将新元素添加到向量的末尾,每次都会增加其大小。

相反:

class Menu
{
private:
    vector<menuItem> mi;
    // int count; // no need for this, use mi.size()
    void runSelection();
public:
    Menu();
    void addMenu(char *Description, void (*f) ());
    void runMenu();
    void waitKey();
};

void Menu::addMenu(char *Description, void (*f) (void))
{
    menuItem item = {f, Description};
    mi.push_back(item); // add the new element to the end (back)
}