c++ - C++ initializer_list迭代器返回错误值

标签 c++ initializer-list

我有一个这样定义的类:

initializer_list<string> choices;
initializer_list<string>::iterator current_choice;
bool has_choices = false;
MenuItem(Position position, string prompt) { this->position = position; this->prompt = prompt; }
MenuItem(Position position, string prompt, initializer_list<string> choices) : MenuItem(position, prompt) {
    this->choices = choices;
    this->current_choice = this->choices.begin();
    this->text = *(this->current_choice);
    this->has_choices = true;
}

当前菜单项定义为
MenuItem * current_menu_item =&menuItems [menuItemIndex];

当我遍历构造函数中的initializer_list时,将输出正确的值。但是稍后在代码中,当我尝试切换值时,如下所示:
 if (c == KEY_RIGHT) {
    if (current_menu_item->has_choices)
    {
        if (current_menu_item->current_choice != current_menu_item->choices.end()) {
            current_menu_item->current_choice++;
            current_menu_item->text = *(current_menu_item->current_choice);
        }
    }
}

它显示了下一个菜单项对象的initializer_list的第一个值,然后按向右键,然后崩溃。如果选择了下一个对象,然后按向右键,它将崩溃。

像这样将对象放入 vector 中
menuItems.push_back(MenuItem(Position(5, 15), "Religion: ", { "*", "*", "*", "Protestant" }));
menuItems.push_back(MenuItem(Position(30, 5), "Do you smoke? ", { "Yes", "No" }));

我已经尝试在整个代码的各个阶段进行调试,但是似乎无法查明哪里或为什么会出错。

没关系,两个人指出我应该使用常规容器而不是initializer_list。感谢大家的回答。我现在觉得很蠢。我要做的就是将initializer_list更改为 vector ,而无需更改任何其他代码。我爱C++。

最佳答案

摘自“Working Draft C++,2012-11-02”

18.9 Initializer lists [support.initlist]
2 An object of type initializer_list provides access to an array of objects of type const E. [ Note: A pair of pointers or a pointer plus a length would be obvious representations for initializer_list. initializer_list is used to implement initializer lists as specified in 8.5.4. Copying an initializer list does not copy the underlying elements. — end note ]



例如,如果我将初始化程序列表复制到std::vector中,则效果很好。您应该将choices定义为常规容器,而不是std::initializer_list
#include <string>
#include <vector>
#include <iostream>
#include <iterator>

struct A {
    A(const std::initializer_list<std::string> &args) : v(args) {}
    void dump() {
        std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    }

    std::vector<std::string> v;
};

int main(int argc, char **argv)
{
    A a({"Hello, ", "world!"});
    a.dump();
    return 0;
}

关于c++ - C++ initializer_list迭代器返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15180990/

相关文章:

c++ - Boost Graph 通过 vertex_descriptor 访问属性

c++ - 构造函数中的初始化列表问题

c++ - 使用静态方法初始化 const 类字段是好事还是坏事?

c++ - 为什么这被认为是一个扩展的初始化列表?

c++11 - Unordered_map 从具有重复键的初始化列表构造

c++ - gcc中的初始化列表错误?

c++ - 计算 sprintf() 缓冲区的大小

c++ - 如何使用全局键盘 Hook 发送键?

c++ - Visual Studio 错误 C2784

java - {c++} Vertex* myList 和 {java} List myList 有何相似之处?