1. ホーム
  2. c++

[解決済み] テスト

2022-01-29 10:23:36

質問

StackOverflowや複数のGoogleのリンクで私の問題を調べましたが、まだ混乱しています。私は自分にとって最良のことは、尋ねることだと思った...

簡単なコマンドライン電卓を作成しています。以下は、これまでの私のコードです。

const std::string Calculator::SIN("sin");  
const std::string Calculator::COS("cos");  
const std::string Calculator::TAN("tan");  
const std::string Calculator::LOG( "log" );  
const std::string Calculator::LOG10( "log10" );

void Calculator::set_command( std::string cmd ) {

    for(unsigned i = 0; i < cmd.length(); i++)
    {
    cmd[i] = tolower(cmd[i]);
    }

    command = cmd;
}

bool Calculator::is_legal_command() const {

    switch(command)
    {
    case TAN:
    case SIN:
    case COS:
    case LOG:
    case LOG10:
        return true;
        break;
    default:
        return false;
        break;
    }

}

というエラーが表示されます。

Calculator.cpp: In member function 'bool Calculator::is_trig_command() const':  
Calculator.cpp: error: switch quantity not an integer  
Calculator.cpp: error: 'Calculator::TAN' cannot appear in a constant-expression  
Calculator.cpp: error: 'Calculator::SIN' cannot appear in a constant-expression  
Calculator.cpp: error: 'Calculator::COS' cannot appear in a constant-expression  

マイティーインターネットでは、switch文に文字列が使えると書いてありますね。

皆さん、ありがとうございます。

解決方法は?

switch である必要があります。 積分型 または積分型への明確な変換が可能なクラス型であること" ( VS2008のドキュメントを引用 ).

文字列クラスは、quot;unambiguous conversion to integral type" を持ちません。 char があります。

回避策として

  1. を作成します。 map<string, int> を作成し、マップの値を切り替えます。 switch(command_map[command]) `

  2. のセットを行う。 if / else スイッチの代わりに ずっと煩わしいし、読みにくいので、地図ルートをお勧めします。

余談ですが、このような本当に複雑なロジックの場合、さらに良い解決策は、マッピングソリューションを改良して switch を完全に削除し、代わりに関数ルックアップを使用するようにしました。 std::map<std::string, functionPointerType> . これは、あなたの特定のケースには必要ないかもしれませんが、複雑で非常に長いルックアップ・ロジックでは非常に高速です。