交叉字符串初始化并跳转到标签案例

时间:2017-03-05 11:58:46

标签: c++ menu switch-statement

我正在为我的程序做案例菜单。我总是得到交叉初始化的错误,我以前从未见过这个错误。也许有人可以解释我的代码发生了什么问题。

#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;

}

错误:

In function 'void menu()':
    [Error] jump to case label [-fpermissive]
    [Error] crosses initialization of 'std::ofstream outputFile'
    [Error] crosses initialization of 'std::string mystr3'
    [Error] crosses initialization of 'std::string mystr2'
    [Error] crosses initialization of 'std::string mystr'

2 个答案:

答案 0 :(得分:1)

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

您最干净的事情就是在case 1:break; case 2:之间剪切所有内容并将其粘贴到名为enterCar的新函数中。

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

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

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

答案 1 :(得分:0)

您必须将变量定义括在 case -blocks中,并使用范围括号{}。

另一件事:忘记 #define 的完成时间常数,使用 constexpr

foreach (ListViewItem listViewItem in l1.Items)
{
    var item = l2.Items.Cast<ListViewItem>().Where(lvi => lvi.Text == listViewItem.Text);
    item.Selected=true;
}

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

此外,您还包括 cstdlib stdlib.h 。来自C-standardlibrary的头文件应始终包含在c-prefix和.h-omission中,因此请将 stdlib.h 删除。无论如何你根本不需要它。