【问题标题】:C++ Switch StatementC++ 切换语句
【发布时间】:2016-10-06 20:32:46
【问题描述】:

最近(昨天哈哈)我开始学习 C++。我正在尝试制作一个简单的计算器来练习。我使用 switch 语句来调用类中的正确方法(或者它是函数.. 不知道 c++ 的细微差别...);

但是,代码不会编译,因为我正在使用一个字符串来定义要使用的情况,并定义多个类以获得相同的结果。

这是 switch 语句(在添加其他错误之前,我只做了添加以消除任何错误):

switch(input){
        case 'A': case 'a': case 'add': case 'Add':
            cout << bo.addNum();
            break;
        default:
            cout << "Not addition";
            break;
    }

我得到的错误如下:

basic.cpp:41:2: error: statement requires expression of integer type ('string'
      (aka 'basic_string<char, char_traits<char>, allocator<char> >') invalid)
        switch(input){
        ^      ~~~~~
basic.cpp:42:28: warning: multi-character character constant [-Wmultichar]
                case 'A': case 'a': case 'add': case 'Add':
                                         ^
basic.cpp:42:40: warning: multi-character character constant [-Wmultichar]
                case 'A': case 'a': case 'add': case 'Add':
                                                     ^

以下是全部代码:

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

class beckahClass{
public:
    void setNum(int num1, int num2){
        a = num1;
        b = num2;
    }
    int addNum(){
        return a + b;
    }
    int subNum(){
        return a - b;
    }
    int divNum(){
        return a / b;
    }
    int multNum(){
        return a * b;
    }
private:
    int a, b;
};

int main (void){
    beckahClass bo;
    string input;
    int a, b;

    cout << "Please specify the operation to preform by the following:\n A: add\nS: subtract\nM: Multiple\nD: divide\nEnter operation:  ";
    cin >> input;

    cout << "Enter the two nums you want to preform your operation on: ";
    cin >> a >> b;
    bo.setNum(a, b);

    switch(input){
        case 'A': case 'a': case 'add': case 'Add':
            cout << bo.addNum();
            break;
        default:
            cout << "Not addition";
            break;
    }   
    return 0;
}

我也意识到可能有更有效的方法来使用逻辑;因为我刚刚开始使用 C++,所以我将不胜感激任何批评。我之前一直在简单地查找“地图”,想知道这是否是一个使用它的好实例?

谢谢。

【问题讨论】:

  • AFAIK 你不能有一个字符串参数的 switch 语句。您应该将其更改为 int 或 char。
  • Switch statments 非常适用于枚举,了解枚举,您的计算器仍然可以使用带有枚举的 switch。
  • 这篇文章有一些很好的信息开关是什么:okprogrammerblog.com/single-post/2017/12/21/…

标签: c++ switch-statement


【解决方案1】:

原因是 C/C++ switch 语句接受一个 int 参数并且不支持 string 作为类型。虽然它支持常量数组的概念。还要提一下,C/C++ switch 语句通常生成为 branch tables.,使用string 样式的 switch 生成分支表并不容易。

在 C++ 中,switch 语句将int 作为参数。

为什么不能在 switch 中串入字符串并出现以下错误?

basic.cpp:42:28: warning: multi-character character constant [-Wmultichar]
                case 'A': case 'a': case 'add': case 'Add':
                                         ^
basic.cpp:42:40: warning: multi-character character constant [-Wmultichar]
                case 'A': case 'a': case 'add': case 'Add':

原因是因为要生成 switch 的代码,编译器必须理解两个值相等意味着什么。对于 int 和 enum,因为它们是常量值,所以它是微不足道的和容易的。但是当涉及到字符串时,很难导致错误。

【讨论】:

  • 这非常有用。也许更好的主意是使用 elseif 逻辑?
  • @rsheeler:- 是的,在这种情况下这将是一个更好的主意!
【解决方案2】:

C++ 中,switch 语句采用int 参数,而您正在尝试将它与string 一起使用,而这在C++ 中是无法做到的。

在这种特定情况下,我认为您尝试使用 switch 做的事情远非简单,if else 块会更好(而且它实际上可以与 string 一起使用) .

例如:

if(input == "A" || input == "a" || input == "add" || input == "Add") {
    cout << bo.addNum();
} else {
    cout << "Not addition";
}

或者,正如其他人所解释的那样,您可以在charswitch。事实证明,您可以很好地访问字符串的各个字符。此方法将使您的switch 语句对您作为inputstring 的第一个字符起作用。

switch(input[0]) {
    case 'A': case 'a':
        //stuff
        break;
    case 'S': case 's':
        //stuff
        break;
    //and so on
    default:
        //stuff
        break;
}

请记住,如果您这样做,您将输入case 'A': case 'a':,无论用户键入AaaddAddaddition、@987654342 @、ADD、或Apples、或alphabet,或以a开头的任何内容。

【讨论】:

    【解决方案3】:

    欢迎来到 C++ 的世界,希望你喜欢。

    不管怎样,让我们​​谈谈你的问题。首先,方法和功能是同义词。

    其次,单引号用于单个字符,双引号用于字符串。 正如我有一个字符串"Rabbiya",它由字符'R','a','b','i','y' 组成。得到它? 所以你在代码中像这样写"add"'a'。明白了吗?

    同样在 switch 语句中,您使用两种不同的数据类型来检查条件,一种是字符,另一种是字符串。 "add""Add" 是字符串,'a''A' 是字符。这是错误的。案例具有 switch 语句的参数可以或可能采用的值。并且参数显然是特定类型的变量,我们将得到它。

    CASES的数据类型必须与switch-语句的ARGUMENT相同。这是您可以做的一件事,而不是保留charstring,而是要求用户使用数字来标识他们执行的操作。喜欢

    int a = 0;
    cout << Enter: 1 for Add\n2 for Sub\n3 for Div\n4 for Sub: ";
    cin >> a;

    然后你使用 switch(a) 语句与案例:case:1case:2 等等。

    这里最好也有一个默认情况,这样如果提供了无效的输入,它会生成一个错误消息。

    还有一件事,在类中,您有两个数据成员,即ab。您也需要初始化这些! 否则,您将收到取决于编译器的错误或垃圾值。为此,您编写类构造函数。什么是构造函数?它们帮助您初始化类对象的数据成员。 为此,您应该参考此链接:http://www.learncpp.com/cpp-tutorial/85-constructors/

    http://www.learncpp.com/ 将在整个课程中为您提供很多帮助!

    【讨论】:

      【解决方案4】:

      字符串输入;

      试试改成

      char input 
      

      【讨论】:

        【解决方案5】:

        正如前面所说,C++ 不支持在 switch 语句中使用用户定义类型(std::string 是用户定义类型)。它只允许使用整数类型或枚举。顺便说一下,char 类型属于整数类型。如果你想在 switch 语句中使用字符串,那么用 C# 编写你的程序。

        【讨论】:

          【解决方案6】:

          您可以使用任何类型的 c/c++ switch implementation。您的代码将是这样的:

          SWITCH(input)
              CASE("A") FALL
              CASE("a") FALL
              CASE("Add") FALL
              CASE("add") FALL
                  cout << bo.addNum();
                  BREAK
              DEFAULT
                  cout << "Not addition";
          END
          

          【讨论】:

            猜你喜欢
            • 2014-04-20
            • 1970-01-01
            • 2016-05-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-22
            • 1970-01-01
            相关资源
            最近更新 更多