Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

typedef'ing an enum does not make the enum-values visible

Tags:

c++

enums

I have a class in which I have an enumeration, defined like this:

class X
   {
   public:
      enum Direction {DIR_LEFT, DIR_RIGHT};
   };

Now I want this enumeration to be reused in another class, like this:

class Y
   {
   public:
      typedef X::Direction Direction;
   };

As expected, using Y::Direction works correctly, e.g.:

void myFunction (Y::Direction dir)
{
}

But the values within the enumeration does not seem to be 'copied' together with the typedef. If I write the following, I get compilation errors:

myFunction (Y::DIR_LEFT);

Instead, I have to refer to the original place of the enumeration again, like this:

myFunction (X::DIR_LEFT);

Which defeats my purpose of typdefing the enumeration.

The only solution I see is to move the enumeration out of class X, and putting it in another class (e.g. MyEnums), so it can be reused by X and Y (although they should still use MyEnums::DIR_LEFT and MyEnums::DIR_RIGHT), but at least the code does not depend on class X anymore.

Why are the enumeration values itself no exposed via the typedef?

Are there any other patterns to manage enumerations in different classes?

like image 587
Patrick Avatar asked Mar 15 '11 17:03

Patrick


People also ask

Can you typedef an enum?

Using the typedef and enum keywords we can define a type that can have either one value or another. It's one of the most important uses of the typedef keyword. This is the syntax of an enumerated type: typedef enum { //...

What is typedef enum in Objective C?

A typedef in Objective-C is exactly the same as a typedef in C. And an enum in Objective-C is exactly the same as an enum in C. This declares an enum with three constants kCircle = 0, kRectangle = 1 and kOblateSpheroid = 2, and gives the enum type the name ShapeType.

How do you declare an enum in C++?

An enumeration is a user-defined data type that consists of integral constants. To define an enumeration, keyword enum is used. enum season { spring, summer, autumn, winter }; Here, the name of the enumeration is season .

What is the difference between enum and struct?

struct - Used to define a structure type. enum - Used to define an enumeration. readonly - Used to make an object immutable.


1 Answers

Unfortunately C++ doesn't introduce a new scope with an enum although C++0x is improving things.

Practically this means that you can't typedef an enum and get the enumerated values as well.

What you can do is use a nested struct with the name you want for the enum and typedef THAT.

class X
{
public:
    struct Direction { enum EnumType {LEFT, RIGHT}; };
};

class Y
{
public:
    typedef X::Direction Direction;
};

Now you can do: myFunction (Y::Direction::LEFT);

The purpose of the nested struct is to create a "fake" scope to holld both the enum name and its values.

like image 174
Mark B Avatar answered Nov 14 '22 15:11

Mark B