Switch / Enum Part 2 (Enum)
enum in C++
Recall
- In an early discussion, we were trying to give driving direction, and there was a finite set of actions:
- turn right
- turn left
- continue straight
- arrive
switch provided a convenient way to choose among specific, finite values
if...else also works, but switch is often more convenient for finite values
Switch
int action = ...;
switch (action) {
case 0: //turn right
Serial.println("Turn right (you can turn on red)");
break;
case 1: //turn left
Serial.println("Turn left (wait for arrow)");
break;
case 2: //continue
Serial.println("Keep going straight");
break;
case 3: //arrived
Serial.println("You have arrived!");
break;
default:
Serial.println("Error!");
}
Another improvement
- This was cleaning and easier to read
- However, the actions (or states) are still a little confusing
- Ex: We need to remember that case 2 means continue straight
case 2: //continue
Serial.println("Keep going straight");
- These is another improvement we can make
enum
enum is a user-defined data type
- This means we get to decide what its values will be
enum that allows us to give labels to literal (constant) values
- It can make our code much more self-explanatory and logical
enum Syntax
enum <<enum_name>> { <<value1>>, <<value2>>, ...}
enum is the type keyword
<<enum_Name>> is a name we define (it will become like int or String)
<<value1>> … <<value2>> are the allowed value we will let our variable take
- By default, C++ treats each of these values as starting at
0 and increasing by 1
Recall
int action = ...;
switch (action) {
case 0: //turn right
Serial.println("Turn right (you can turn on red)");
break;
case 1: //turn left
Serial.println("Turn left (wait for arrow)");
break;
case 2: //continue
Serial.println("Keep going straight");
break;
case 3: //arrived
Serial.println("You have arrived!");
break;
default:
Serial.println("Error!");
}
enum Example
- There are four actions or states we need to represent
- Turn left, Turn right, Go straight, arrive
- Let’s define our
enum and call it Operation
enum Operation {left, right, straight, arrive};
Operation value of left is equivalent to 0
Operation value of right is equivalent to 1
Operation value of straight is equivalent to 2
Operation value of arrive is equivalent to 3
enum Example
- Now we can create a
Operation variable
action would be given a value from some function we write
- You could also assign a literal value to
action like this
Operation action = straight; //equivalent to int value of 2
- We can now use our
Operation value to control the switch
enum Example
Operation action = ...;
switch (action) {
case right:
Serial.println("Turn right (you can turn on red)");
break;
case left:
Serial.println("Turn left (wait for arrow)");
break;
case straight:
Serial.println("Keep going straight");
break;
case arrive:
Serial.println("You have arrived!");
break;
default:
Serial.println("Error!");
}
Tip: Converting String to enum
- If you have an
int stored as a String but want to use enum for your a switch statement, first covert to an int with toInt() and then cast to enum
enum Operation {left, right, straight, arrive};
String opStr = "0"; //this often comes from an event handler
int opInt = opStr.toInt(); //int 0
Operation op = (Operation) opInt; //Operation LEFT