【问题标题】:Big problem with classes , and returning from void function c++类的大问题,以及从 void 函数 c++ 返回
【发布时间】:2020-01-27 22:03:33
【问题描述】:

所以这是我第一次学习一门语言,我真的很高兴能在课堂上玩耍,我确实有一个我似乎无法理解的主要问题; 我正在建立一个银行菜单。它当然是一类,我有另一类客户,基本上是我银行中的一个数组。 所以我在银行里面的菜单功能是这样的:

 void menu (){
    manager();
    int n,m;
    cout << "welcome to our bank managment system. \n";
    cout << "please choose one of the following options : \n";
    cout << "1-add a new client\n";
    cout << "2-remove a leaving client\n";
    cout << "3-bank statistics\n";
    cout << "4-if you are a costumer\n";
    cout << "5-exit\n";
    cin  >> n ;
    if()
    if()
    if()
    if()
    if()

注意我的返回函数在里面被召唤了很多

我有一个返回功能可以返回菜单:

void returnfunction (){
    int back = 0;
    cout << "\n0-back to menu \n press a diffrent number back to exit :)\n";
    cin >> back ;
     if (back==0){
        return menu();
     }
    if (back!=0){
    cout << "thank you for using our program ! ";
       return ;
    }

它运行完美,直到我玩得太多,然后按 5 退出(这是我的 n==5 选项) 我必须强调,当我在几个简单的动作后达到 5 时,它的工作正常...... 我怎样才能修复那个返回函数?

当然我的主要看起来是这样的:

int main()
{
    srand (time(NULL));
    Bank b ;
    b.menu();
}

感谢你所有的智慧,非常感谢

【问题讨论】:

    标签: c++ arrays class object return-value


    【解决方案1】:

    你的功能:

    void returnfunction ()
    

    被声明为 return 什么都没有 (void) 但你:

       return menu();
    

    return 的东西,这很不清楚(即使menu() 也返回void

    如果你想打电话给menu() 然后return 写:

        menu();
        return;
    

    【讨论】:

    • 其实没问题,只要menu返回void
    • @Quentin 好的,以前从未遇到过。编辑后的答案 - 谢谢。
    • 我的问题是没有返回菜单。但退出它///
    【解决方案2】:

    这段代码有几个问题,老实说,它不会在其他命令式 OO 语言中编译。但这是规则无关紧要的c++。旁白:如果您没有充分的理由使用 C++,请先学习 Rust。我保证你以后会感谢我的。

    保罗有权这样做。编译器应该在该语句处出错:

    return menu();
    

    然而等价物是完全合法的:

    menu();
    return;
    

    但这仍然会在理论上(但可能不会在实践中)引起问题,因为您的函数几乎但不是尾递归优化的候选者。更多这里Which, if any, C++ compilers do tail-recursion optimization?

    当用户多次返回菜单时,这会成为一个问题,它会耗尽您的程序内存,最终导致堆栈溢出错误。您会在大多数 GUI / 图形库中找到的常见模式是主循环。比如:

    int main() {
      bool exit = false
      while(!exit) {
        int action = menu()
        switch(action) {
        case EXIT_SELECTION:  exit = true; break;
        case SHOW_STATISTICS: printStats(); break;
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      每次调用函数时,程序都必须使用更多内存来跟踪与该函数调用相关的所有内容。通常,一旦一个函数结束,这个内存就会被释放,但是因为你的菜单函数调用了另一个函数,这个函数调用了你的菜单函数,这个函数调用了另一个函数……等等,你最终会从所有函数调用中耗尽内存,因为这些函数在它们调用的函数终止之前无法终止——因此您的程序将崩溃。解决方案是使用 while 循环并检查用户输入的退出代码,如前面提到的响应者。它可能看起来像:

      `void menu() {
          char choice= '\0';
      
          while(choice!= 3) {
              std::cout << "Welcome to the menu!";
              std::cout << "\t Option 1 \n";
              std::cout << "\t Option 2 \n";
              std::cout << "\t Option 3 \n";
              std::cout << "Your option: ";
              std::cin >> choice;
      
              if(choice == 1) { /*do something*/ }
              else if(choice == 2) { /*do something else*/ }
              else if(choice == 3) { /*print a message and exit*/ }
              else { /*bad choice -- try again*/ }
          } //end while-loop
      } //end menu()`
      

      另外,请注意您的函数的返回类型是void,根据定义,它不能有任何类型的返回。 C++ 将允许您在 void 函数内说 return;,但这只是一种在当时和那里逃避该函数的方法,并没有真正打算做更多的事情。在处理 void 函数时以任何其他方式使用 return 会让人感到困惑,并有导致大问题的风险。

      【讨论】:

        猜你喜欢
        • 2016-08-28
        • 2011-03-26
        • 2018-04-06
        • 2015-01-24
        • 1970-01-01
        • 1970-01-01
        • 2015-03-24
        • 2017-07-13
        • 2012-02-26
        相关资源
        最近更新 更多