문제

나는이 열거가있다 :

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

const u8 NUM_BUTTON_STATES = 3;

내 버튼 클래스에는 멤버 변수가 있습니다 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
  };
};

단점은 그게됩니다 숫자 _of_button_states 이제 유효합니다 버튼 :: 상태 값. 이 값을 다음과 같이 전달하는 경우 큰 문제가 아닙니다. ints. 그러나 실제로 당신이 실제로 기대하고 있다면 문제 버튼 :: 상태.

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

괜찮아. 단지 문서 그것은 다음 사람이 무슨 일이 일어나고 있는지 알고 있습니다! (그게 댓글이 무엇인지입니다.)

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

'='할당 없음, 열거 해야합니다 0에서 시작하여 위쪽으로 증가합니다.

열거 항목에 '='할당 된 값이 있으면 후속 비 '='열거 항목이 계속 계산됩니다.

원천: 주석이 달린 C ++ 참조 매뉴얼, pg 113

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

다른 팁

예, 잘 작동합니다. 어쨌든 당신은 진짜 항목 금액의 값을 정의하는 열거에 다른 항목을 배치해야합니다.

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

그런 다음 배열을 정의 할 수 있습니다

Color colors[STATE_COUNT];

그렇지 않으면 상태의 양을 배열의 크기와 동기를 유지하는 것이 혼란입니다. 다른 달리 초기화되지 않은 경우 열거는 항상 0으로 시작하며, 각각의 추가 항목에는 초기화되지 않은 경우 이전의 값 위에있는 값이 할당됩니다. 물론 원한다면 명시 적으로 제로를 넣으면 아프지 않을 것입니다. 추가 코드가 마음에 들지 않으면 같은 함수를 사용하여 원시 배열에 대한 액세스를 랩핑합니다.

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

또는 동등한 getColor 요청을 전달합니다. 그것은 일부 정수로 배열을 직접 인덱싱하는 것을 금지 할 것입니다. 이는 인덱스가 잘못 되었기 때문에 거의 확실하게 실패 할 것입니다.

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

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

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

그리고 나는 NUM_BUTTON_STATES를 열망에 넣을 것입니다.

스타일 측면, 괜찮습니다.

Delphi와 같은 Pascal 기반 언어는 배열 경계를 열거 형으로 지정할 수 있으므로 해당 특정 유형의 항목 만 색인으로 만 사용할 수 있습니다.

배열로 인덱싱하기 위해 열거를 사용하는 것은 완벽하게 정상입니다.

각 열거 값을 지정할 필요는 없으며 1로 자동으로 증가합니다. 컴파일러가 값을 선택하게하면 값을 선택하면 안개가 흡입되고 버그를 생성 할 가능성이 줄어들지 만 값을 보는 것을 박탈하여 디버깅에 유용 할 수 있습니다.

괜찮습니다. 그러나 누군가가 다른 ButtonState를 추가하는 것처럼 배열에서 바운드를 확인하고 싶습니다. 문제가 발생할 수 있습니다.

또한 색상 배열의 요소는 불변이 아니므로 다른 컬렉션을 사용하여 배열을 사용하여 해당 불변성을 시행 할 수 있습니다. 어쩌면 A. Dictionary<ButtonState,ButtonColor>

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top