私はこのように定義されたクラスを持っています:
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の最初の値が表示され、右を押すとクラッシュします。次のオブジェクトを選択して右に押すと、クラッシュします。
オブジェクトはそのようにベクトルに入れられます
menuItems.push_back(MenuItem(Position(5, 15), "Religion: ", { "*", "*", "*", "Protestant" }));
menuItems.push_back(MenuItem(Position(30, 5), "Do you smoke? ", { "Yes", "No" }));
コード全体のさまざまなポイントでデバッグを試みましたが、どこで、またはなぜそれがうまくいかないのかを正確に特定できないようです。
気にしないでください。2人の人が、initializer_listの代わりに通常のコンテナを使用する必要があると指摘しました。皆さん、答えてくれてありがとう。今は馬鹿げています。私がしなければならなかったのは、他のコードを変更せずに、initializer_listをベクトルに変更することだけでした。私はC++が大好きです。