2013-09-25 3 views
2

Возможно ли сделать два разных перечисления с одинаковым значением? Например,Различные перечисления, то же значение

enum direction{ 
    LEFT, 
    RIGHT, 
    UP, 
    DOWN, 
    NONE 
} 
enum color{ 
    RED, 
    GREEN, 
    BLUE, 
    NONE 
} 

Компилятор сказал бы, что есть два заявления «NONE». Есть ли способ обойти это?

ответ

8

Существует несколько способов обойти это. Один из способов заключаются в использовании пространств имен, чтобы обернуть перечисления и предотвратить значение от загрязнения глобального пространства имен:

namespace direction { 
    enum direction { 
     LEFT, 
     RIGHT, 
     UP, 
     DOWN, 
     NONE 
    }; 
} 
namespace color { 
    enum color { 
     RED, 
     GREEN, 
     BLUE, 
     NONE 
    }; 
} 

Вы также можете использовать новый способ C++ 11 (если ваш компилятор поддерживает его) и использовать «строго типизированный перечисления»

enum class direction { 
    LEFT, 
    RIGHT, 
    UP, 
    DOWN, 
    NONE 
}; 
enum class color { 
    RED, 
    GREEN, 
    BLUE, 
    NONE 
}; 

Оба они могут быть использованы в синтаксисе direction::NONE или color::NONE но есть одно существенное различие. В первом случае перечисления будут по-прежнему неявно отбрасываться в ints. Это означает, что вы можете написать

int foo = direction::NONE;

и все в порядке.

Во втором случае это была бы ошибка компилятора, так как foo не является тем же типом, что и направление. Вы можете обойти эту проблему, делая

direction foo = direction::NONE;

, которые могут или не могут работать на вас. Если вам нужно передать его в int, вы можете использовать static_cast<int>(foo), чтобы получить целочисленный тип.

+0

Спасибо, первый метод кажется более эффективным для того, что я делаю прямо сейчас, поэтому я буду придерживаться его. – JorensM

Смежные вопросы