Development Tip

열거 형을 배열 인덱스로 사용

yourdevel 2020. 12. 30. 19:44
반응형

열거 형을 배열 인덱스로 사용


이 열거 형이 있습니다.

enum ButtonState {
    BUTTON_NORMAL = 0,
    BUTTON_PRESSED = 1,
    BUTTON_CLICKED = 2
};

const u8 NUM_BUTTON_STATES = 3;

내 Button 클래스에는 멤버 변수 ButtonState state;ButtonColors colors[NUM_BUTTON_STATES];. 버튼을 그릴 때 colors[state]버튼이있는 상태에 대한 색상을 가져 오는 데 사용 합니다.

내 질문 :

  1. 좋은 프로그래밍 스타일인가요? 더 나은 방법이 있습니까? (보통 스위치 문에만 열거 형을 사용합니다 ... 열거 형을 배열 인덱스로 사용하는 것은 옳지 않습니다.)
  2. 나는 마 열거 형의 값을 지정? 기본적으로 0에서 시작하여 1 씩 증가하는 것처럼 보이지만 모든 컴파일러에서 그렇게 작동하는 것이 보장됩니까?

좋은 프로그래밍 스타일인가요?

나도 그렇게 생각해. 나는 똑같은 일을 꽤 자주한다.

더 나은 방법이 있습니까?

class Button
{
public:
    // Used for array indexes!  Don't change the numbers!
  enum State {
    NORMAL = 0,
    PRESSED,
    CLICKED,
    NUMBER_OF_BUTTON_STATES
  };
};

단점은 NUMBER_OF_BUTTON_STATES 가 이제 유효한 Button :: State 값이라는 것입니다. 이 값을 int 로 전달하는 경우 큰 문제는 아닙니다 . 그러나 실제로 Button :: State를 기대하는 경우 문제가 있습니다 .

열거 형을 배열 인덱스로 사용하는 것은 옳지 않습니다.

괜찮아. 그냥 문서화 하면 다음 사람이 무슨 일이 일어나고 있는지 알 수 있습니다! (그것이 댓글의 목적입니다.)

열거 형 값을 지정해야합니까?

'='할당이 없으면 열거 형 은 0 에서 시작하여 위쪽으로 증가합니다.

열거 형 항목에 '='할당 된 값이있는 경우 이후의 '='가 아닌 열거 형 항목은 계속 계산됩니다.

출처 : The Annotated C ++ Reference Manual , pg 113

즉, 코드를 훨씬 더 명확하게 만들기 위해 초기 값을 지정하고 싶습니다.


예, 잘 작동합니다. 즉 어떤 경우에, 당신은 말했다 정말 항목의 양의 값을 정의하여 열거 다른 항목을 넣어해야합니다 :

enum ButtonState {
    BUTTON_NORMAL,
    BUTTON_PRESSED,
    BUTTON_CLICKED,
    STATE_COUNT
};

그런 다음 다음과 같이 배열을 정의 할 수 있습니다.

Color colors[STATE_COUNT];

그렇지 않으면 상태의 양을 배열의 크기와 동 기적으로 유지하는 것이 엉망입니다. 열거 형은 초기화되지 않은 경우 항상 0으로 시작하고, 초기화되지 않은 경우 각 추가 항목에는 이전 항목보다 1보다 높은 값이 할당됩니다. 물론 원하는 경우 명시 적으로 0을 입력해도 문제가되지 않습니다. 추가 코드가 마음에 들지 않으면 다음과 같은 함수를 사용하여 원시 배열에 대한 액세스를 래핑합니다.

Color & operator[](ButtonState state) {
    return array[state];
}

또는 getColor요청을 전달 하는 동등한 기능. 그것은 정수로 배열을 직접 인덱싱하는 것을 금지 할 것이며, 인덱스가 잘못되어서 거의 확실하게 실패 할 것입니다.


열거 형을 사용하는 것은 괜찮습니다. 그러나 모든 항목에 대해 값을 지정할 필요는 없습니다. 첫 번째 값을 지정하는 것으로 충분합니다. 1을 시작 값으로 사용하는 컴파일러를 사용했기 때문에 열거 형이 0에서 시작한다고 가정하지 않습니다 (PC 용이 아니라 마이크로 컨트롤러 용 일부 컴파일러에는 이상한 동작이 있음). 또한 const를 제거 할 수 있습니다.

enum ButtonState {
    BUTTON_NORMAL = 0,
    BUTTON_PRESSED,
    BUTTON_CLICKED,
    NUM_BUTTON_STATES
};

질문 1 : 좋은 프로그래밍 스타일이라고 생각합니다. 나는 항상 그것을 사용합니다. 질문 2 : 내가 아는 한 그렇게 작동하는 것이 보장되므로 값을 지정할 필요가 없습니다.

그리고 NUM_BUTTON_STATES도 열거 형에 넣습니다.


스타일면에서는 괜찮습니다.

Pascal-based languages like Delphi allow array bounds to be specified as an enum type, so you can only use items of that specific type as an index.


It is perfectly normal to use an enum for indexing into an array.

You don't have to specify each enum value, they will increment automatically by 1. Letting the compiler pick the values reduces the possibility of mistyping and creating a bug, but it deprives you of seeing the values, which might be useful in debugging.


It's fine, but I'd want to do some bounds checking on the array, as if someone adds another ButtonState, you'll have a problem.

Also, the elements of the colors array are immutable, so maybe look at using a different collection to array so that you can enforce that immutability. Maybe a Dictionary<ButtonState,ButtonColor>

ReferenceURL : https://stackoverflow.com/questions/404231/using-an-enum-as-an-array-index

반응형