Hossein Hossein - 3 months ago 8
C++ Question

How to use enums in C++

Suppose we have an

enum
like the following:

enum Days {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday};


I want to create an instance of this
enum
and initialize it with a proper value, so I do:

Days day = Days.Saturday;


Now I want to check my variable or instance with an existing
enum
value, so I do:

if (day == Days.Saturday)
{
std::cout<<"Ok its Saturday";
}


Which gives me a compilation error:


error: expected primary-expression before ‘.’ token


So to be clear, what is the difference between saying:

if (day == Days.Saturday) //Causes compilation error


and

if (day == Saturday)


?

What do these two actually refer to, in that one is OK and one causes a compilation error?

Answer

This code is wrong:

enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday};
Days day = Days.Saturday;
if(day == Days.Saturday)

Because days is not a scope, nor object. It is a type. And Types themselves don't have members. What you wrote is the equivalent to std::string.clear. std::string is a type, so you can't use . on it. You use . on an instance of a class.

Unfortunately, enums are magical and so the analogy stops there. Because with a class, you can do std::string::clear to get a pointer to the member function, but in C++03, Days::Sunday is invalid. (Which is sad). This is because C++ is (somewhat) backwards compatable with C, and C had no namespaces, so enumerations had to be in the global namespace. So the syntax is simply:

enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday};
Days day = Saturday;
if(day == Saturday)