C++ 交叉初始化字符串并跳转到标签大小写

C++ 交叉初始化字符串并跳转到标签大小写,c++,menu,switch-statement,C++,Menu,Switch Statement,我正在尝试为我的程序创建案例菜单。我经常会遇到交叉初始化的错误,我以前从未见过这个错误。也许有人能解释我的代码出了什么问题 #include <iostream> #include <cstdlib> #include <string> #include <sstream> #include <stdlib.h> #include <fstream> using namespace std; #define N_CARS

我正在尝试为我的程序创建案例菜单。我经常会遇到交叉初始化的错误,我以前从未见过这个错误。也许有人能解释我的代码出了什么问题

#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
#include <stdlib.h>
#include <fstream>

using namespace std;

#define N_CARS 1

struct car{
    string model;
    int year;
    double price;
    bool available;
}cars [N_CARS];


void menu();
void mainMenu();

void writeToFile(ofstream &outputFile , const car& p)
{
    outputFile << p.model << " "
               << p.year << " "
               << p.price << " "
               << p.available<<"\n";
}

int choice1 = 0;


int main(int argc, char** argv) {

    menu();
    return 0;
}


void menu() {

    do {
        mainMenu();

        switch(choice1) {

            case 1:
                string mystr;
                string mystr2;
                string mystr3;

                int n;
                for (n=0; n<N_CARS; n++)
                {
                    cout << "Enter title: ";
                    getline (cin,cars[n].model);
                    cout << "Enter year: ";
                    getline (cin,mystr);
                    stringstream(mystr) >> cars[n].year;
                    cout << "Enter price: ";
                    getline (cin,mystr2);
                    stringstream(mystr2) >> cars[n].price;
                    cout << "Choose availability: ";
                    getline (cin,mystr3);
                    stringstream(mystr3) >> cars[n].available;
                }

                ofstream outputFile;
                outputFile.open("bla.txt", fstream::app);
                for (n=0; n<N_CARS; n++)
                    writeToFile(outputFile, cars[n]);
                outputFile.close();
                break;

            case 2:
                break;

            case 5:
                break;
        }

    } while(choice1 != 5);

}


void mainMenu(void) {

    cout << "Main Menu\n";
    cout << "1 - Enter Car\n";
    cout << "5 - Quit\n";
    cout << "Please choose: ";

    cin >> choice1;
}

必须用范围括号{}将变量定义括在case块中

另一件事:忘记#定义复杂时间常数,使用constexpr:

还要注意大小:对于描述大小的变量和常量,例如数组大小或索引,请使用大小


此外,还包括cstdlib和stdlib.h。C-standardlibrary中的头文件应始终包含C前缀和.h省略,因此请删除stdlib.h。无论如何你都不需要它。

case
标签真的很像可怕的
goto
标签;它们并不构成新的范围。因此,
开关
选择要跳转到的正确的
大小写
标签,无论好坏,都很像
goto
语句跳转到标签。跳转不允许跨越各种对象的初始化-正如错误消息所说的那样

你要做的最干净的事情就是把
案例1:
中断之间的一切都剪掉;案例2:
并将其粘贴到一个新的函数中,该函数名为
enterCar

void enterCar() {
    // code previously found between the case labels
}

// ...
switch(choice1) {
    case 1: enterCar(); break;
    case 2:
    // ...
}

函数构成了一个新的作用域,可以在其中正确初始化本地对象。作为奖励,您正朝着将所有意大利面代码抛在脑后迈出第一步。

“还要注意大小:对于描述大小的变量和常量,例如数组大小或索引,请使用大小。”-不,最好使用有符号类型来表示大小,否则您将有效地用负数隐藏错误。好的,谢谢你的建议。它现在正在工作,但是
输入标题
不能与
输入年份
一起使用,我现在不能输入标题。链接的帖子不能说服我。它指出,使用有符号整数进行算术并混合使用无符号整数时存在陷阱,但另一方面,使用无符号整数进行算术并混合使用有符号整数基本相同。我想说的一点是:仔细考虑是否要进行有符号或无符号算术。对于NotsoPr0:@TheTechel:是的,混合有符号和无符号是不好的。因此,您通常应该远离无符号数字。无符号数仅对位运算有用,即当您对单个位感兴趣时;当只允许使用正数时,使用它们来避免负数是个坏主意。坏主意?为什么?很好的重构谢谢。但是现在我的输入模型和输入年份都立即出现了,我无法输入模型,我不知道发生了什么,在我开始使用case开关之前它工作了。@NotsoPr0-输入问题在这里描述:谢谢你的帮助!
constexpr size_t NumCars = 5;
void enterCar() {
    // code previously found between the case labels
}

// ...
switch(choice1) {
    case 1: enterCar(); break;
    case 2:
    // ...
}