C++, как получить из консоли char и использовать его в перечислении
Только начал изучать C++, пытаюсь разобраться с перечислениями. Пытаюсь написать простой калькулятор, вот код:
#include <iostream>
#include <cmath>
enum class Operation : char {
ADD = '+',
SUBSTRACT = '-',
MULTIPLY = '*',
DEVIDE = '/',
PERCENT = '%',
POWER = '^'
};
void calculation(double num1, Operation operation, double num2) {
switch (operation) {
case Operation::ADD:
std::cout << num1 + num2;
break;
case Operation::SUBSTRACT:
std::cout << num1 - num2;
break;
case Operation::MULTIPLY:
std::cout << num1 * num2;
break;
case Operation::DEVIDE:
if (num2 == 0) {
std::cout << "divident " << num2 << " is zero!";
}
else {
std::cout << num1 / num2;
}
break;
case Operation::PERCENT:
std::cout << 100.0 * (num1 / num2) << '%';
break;
case Operation::POWER:
std::cout << std::pow(num1, num2);
break;
}
}
int main() {
double num1, num2;
Operation operation;
std::cin >> num1 >> static_cast<Operation>(operation) >> num2;
calculation(num1, operation, num2);
return 0;
}
Пытаюсь из консоли получить два числа double и операцию char. Далее с помощью switch case вывести результат операции в консоль в функции calculator. Проблема в том, что функция calculator ждет тип Operation, а не char. А считать с консоли тип данных Operation не получается, компилятор ругается. Как быть в такой ситуации?
Ответы (2 шт):
Необходимо сначала прочитать с консоли char и записать в переменную char. Затем создать переменную типа Operation и присвоить ей static_cast(<char из консоли>). Функция main перепишется следующим образом:
int main() {
double num1, num2;
char operation_input;
std::cin >> num1 >> operation_input >> num2;
Operation operation = static_cast<Operation>(operation_input);
calculation(num1, operation, num2);
return 0;
}
Так как у вас перечисление это класс, то надо самому написать преобразование типа. Можно просто пока сделать оператор чтения из потока.
std::istream & operator >>(std::istream & is , enum Operation & op){
char ch ;
is >> ch ;
switch(ch){
case '+' :
op = Operation :: ADD ;
return is ;
case '-' :
op = Operation :: SUBSTRACT ;
return is ;
case '*' :
op = Operation :: MULTIPLY ;
return is ;
case '/' :
op = Operation :: DEVIDE ;
return is ;
case '%' :
op = Operation :: PERCENT ;
return is ;
case '^' :
op = Operation :: POWER ;
return is ;
default:
throw "operation not recognised" ;
}
return is;
}