请使用新操作员

时间:2016-02-26 06:41:12

标签: c++ c++11

我在看错误:

C2131: expression did not evaluate to a constant

并且看到需要新的运算符,以便我可以在MSVB中创建动态数组。我的代码在Dev-C ++中运行良好,但我希望它在MSVB中工作。

int lines_in_file()
{
    int number_of_lines = 0;
    std::string line;

    std::ifstream menu_file;
    menu_file.open("menu.dat");

    while (getline(menu_file, line))
        ++number_of_lines;

    menu_file.close();

    return number_of_lines;
}

void employee_menu()
{
    int lines = lines_in_file();
    int choice;
    std::string names[lines];

    std::ifstream menu_file;
    menu_file.open("menu.dat");

    for (int i = 0; i <= lines - 1; i++)
    {
        getline(menu_file, names[i]);
    }

    for (int i = 0; i <= lines - 1; i++)
    {
        std::cout << "Name " << i + 1 << ": " << names[i] << "\n";
    }
}

我搜索了如何使用new运算符,但我不确定为什么示例会继续使用***

正如您可能看到的那样,我正在尝试获取一个菜单,以显示文件中的员工列表。然后,我将使用该菜单选择一名员工并完成其他任务。

2 个答案:

答案 0 :(得分:2)

std::string names[lines];

C ++(甚至VS中的C)并不支持这一点。

您可以使用

std::vector<std::string> names(lines);

std::string *names = new std::string [lines];
...
delete [] names;

答案 1 :(得分:0)

你想在那里使用矢量。 C和C ++中的数组有点奇怪。仅在C99(而非C ++)中引入了对动态长度的自动存储阵列的支持。请注意自动(在大多数系统上解析为&#34;堆栈&#34;),因此这会产生一个非常强大的约束并且会引发许多警告。使用C ++时,应尽可能避免使用数组。请改用std::vector。使用起来更好,为您提供了幕后的内存管理功能,并且可以正常使用#34; (除非你用std::vector分配一个new,在我看来,这只是有悖常理的)std::vector的现代实现做自动引用计数,这样如果你在实际元素周围复制向量是仅在修改时复制(CoW);这比普通数组给你的好多了。所以就这样了。

替换此

std::string names[lines];

用这个

std::vector<std::string> names(lines);
  

我搜索了如何使用new运算符,但我不确定为什么示例会继续使用*或**。

因为在处理new时你正在处理指针。如果您还不知道如何使用指针,那么您绝对必须首先学习如何使用它们。