2017-02-25 3 views
0

に()であれば( ':' '?'、)C++、私は三項演算子の場合は()関数を持っているスイッチとケースの文

if(operation == ':') 
.... 
.... 
    if(operation == '?') 
.... 
    return new ternaryOperator(first, second, third) 

これらは完璧な演算値を与えます。しかし、私はそれらを作る必要があります Switch()とケースステートメント。 Switch()と入れ子になったSwitch()ステートメントも使用しましたが、正しい値が返されません。 これらのif関数をSwitchおよびCaseステートメントに入れるにはどうすればよいですか?

#include <iostream> 
using namespace std; 
#include "expression.h" 
#include "subexpression.h" 
#include "operand.h" 
#include "plus.h" 
#include "minus.h" 
#include "times.h" 
#include "divide.h" 
#include "greaterThan.h" 
#include "lessThan.h" 
#include "equal.h" 
#include "and.h" 
#include "or.h" 
#include "notEqual.h" 
#include "ternaryOperator.h" 

SubExpression::SubExpression(Expression* left, Expression* right){ 
    this->left = left; 
    this->right = right; 
} 

SubExpression::SubExpression(Expression* first, Expression* second, Expression* third) 
{ 
    this->first = first; 
    this->second = second; 
    this->third = third; 
} 

SubExpression::SubExpression(Expression* left) 
{ 
    this->left = left; 
} 

Expression* SubExpression::parse() 
{ 
    Expression* left; 
    Expression* right; 
    Expression* first; 
    Expression* second; 
    Expression* third; 
    char operation, paren; 
    bool isTernary = false; 

    left = Operand::parse(); 
    cin >> operation; 
    right = Operand::parse(); 

    **if (operation == ':') 
    { 
     first = left; 
     second = right; 
     left = Operand::parse(); 
     cin >> operation; 
     right = Operand::parse(); 
     if (operation == '?') 
     { 
     third = right; 
     isTernary = true; 
     } 
    } 

    cin >> paren; 

    if (isTernary == true) 
    { 
     return new ternaryOperator(first, second, third); 
    }** 

    switch (operation) 
    { 

     case '+': 
     return new Plus(left, right); 
     case '-': 
     return new Minus(left, right); 
     case '*': 
     return new Times(left, right); 
     case '/': 
     return new Divide(left, right); 
     case '>': 
     return new greaterThan(left, right); 
     case '<': 
     return new lessThan(left, right); 
     case '=': 
     return new Equal(left, right); 
     case '&': 
     return new And(left, right); 
     case '|': 
     return new Or(left, right); 

     case '!': 
     return new notEqual(left); 
    } 
    return 0; 
} 



class ternaryOperator: public SubExpression 
{ 
    public: 
     ternaryOperator(Expression* first, Expression* second, Expression* third): 
      SubExpression(first, second, third) 
    { 
    } 
     double evaluate() 
     { 
     return third->evaluate() ? first->evaluate() : second->evaluate(); 
     } 
}; 
+0

'スイッチ()'文字列リテラルを処理することはできませんに。 –

+0

しかし、それは文字リテラルを扱うことができます(二重ではなく一重引用符に注意してください)。 @ JC315、あなたはそれらの '操作'値のswitch文であなたの試行を表示できますか? – Squirrel

+0

case ':' first = left; second = right; スイッチ(操作){ ケース '?': 第3 =右; isTernary = true; } IF(真isTernary ==) \t {\t \tリターン新しいternaryOperator(第一、第二、第三); \t} – JC315

答えて

0

私は入れ子になったif(operation == '?')をSwitchとcase文の中に入れてしまい、うまくいきました。 しかし、私はまだ場合は、メインを置く必要があります(操作==「:」)スイッチとケースステートメント

if (operation == ':') 
    { 
     first = left; 
     second = right; 
     left = Operand::parse(); 
     cin >> operation; 
     right = Operand::parse();} 
.. 
... 
.... 
case '?': 
    third = right; 
    return new ternaryOperator(first, second, third);