【问题标题】:object's Scope in switch statementswitch 语句中对象的作用域
【发布时间】:2014-12-25 12:52:45
【问题描述】:

我试图制作一个程序,您可以在其中提供离开 cmets、查看 cmets 和创建帐户的菜单。我将菜单设置为 switch 语句。在大多数情况下,我需要一个“用户对象”,但它是在 case1 中创建的,它的范围仅在 case1 中。我使用了“用户指针”,所以我可以在其他情况下使用它。我有 switch 语句,所以它一直运行到用户退出。当我在 case1 中添加指针并运行程序时它崩溃了。 “我的问题是有另一种方法可以让所有其他情况下都可以访问“在 case1 中创建的用户对象”??

  User *uPointr = NULL;     


 int: selec;
 cout << " enter a selection: " ;

 do{
 switch(selec)
 {
  case 1: // creates  a user
   {
     string name;
     cout << " Enter you name ": ;
     cin >> name;

     User newUser();    // making an new user 
     addUsertoList(newUser);
     *uPointer = newUser();
      break;
   }

   case 2:
  {
    string message;
    count << " Enter message:;
    cin >> message;

    uPointer.addMessage(message);
     break; 

    }
   case 3:
   {
    UPointer->disPlayMessage();
    break;
    }
    case 4:
   {
    exit(0); 
   }

 }
 } While(1);

【问题讨论】:

  • 这段代码有很多问题。首先,您使用未初始化的selec,这是未定义的行为。 selec 的声明是错误的(这不是 Pascal...)。 User newUser(); 不创建用户对象,它声明了一个返回 User 的函数。 *uPointer = newUser() 将尝试调用该不存在的函数并将其返回值存储在 uPointer 指向的对象中,这是一个空指针,再次调用 UB。
  • "User newUser(); // 创建一个新用户" 不。
  • @TheParamagneticCroissant 这应该是答案
  • 您向用户询问 name,但您没有对该名称进行任何操作。这不好,向用户询问不会被处理的信息。
  • 另外,如果您要使用指针,请正确使用它们。这 '。'运算符与实例一起使用,'->' 运算符与指针一起使用。大多数情况下,您不需要使用 new 运算符分配内存。

标签: c++ pointers object switch-statement


【解决方案1】:

相反,您可以使用 std::list 包含指向 switch 之外的用户对象的指针。然后您可以在案例 1 中插入新用户(就像您正在执行 addUsertoList(newUser) 一样),在案例 2,3 中修改该用户 ...等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2019-07-09
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多