2012-05-23 3 views
0

화면에 텍스트를 인쇄하는 간단한 클래스를 만들고 텍스트의 색을 변경할 수 있다고 가정 해 보겠습니다.사용자 인터페이스 함수에 enum 유형을 사용하는 것이 좋습니다.

myclass a("this is the text"); 
a.setColor("green"); 

는 여전히 C를 배우고 ++ 및 최근 enum에 소개하고 나는 그것을 시도 줄 거라고 생각되었다. 위의 setColor과 같은 인터페이스 함수에서 enum 유형을 사용하는 것이 좋은 방법인지 궁금합니다.

인터페이스 기능에서 enum 클래스를 사용하면 어떤 점이 좋습니까? 그들이 더 악용 될만한 경우보다 더 적용 가능한 경우가 있습니까?

속성을 결합하려면 어떻게해야합니까? 예 : 내 클래스의 사용자가 사용하게 할 기능 : 인터페이스 올바른 용어는 내가 설명 할 것입니다 경우

a.setAttribute("bold reverse"); 

모르겠어요.

답변

8

,가 (적어도) 두 가지 장점 :

  • 높은 효율로 이어지는, 실행시에 문자열을 구문 분석 할 필요가 없습니다. 열거 형 변수는 switch 문에서 직접 사용할 수 있습니다.
  • 열거 형은 (어느 정도까지) 자체 문서화이므로 코드 사용자는 유효하지 않은 값을 제공하기 위해 열심히 노력해야합니다.

잠재적 인 "단점"은 컬러 문자열이 예를 들어. 런타임 사용자 입력 (그들은 텍스트 상자 또는 뭔가 입력 한). 이 문자열을 구문 분석하여 열거 형으로 변환해야합니다. 하지만 어쨌든이 작업을 수행해야하기 때문에 실제로는 불리한 점이 아닙니다. 가장 좋은 방법은 사용자 인터페이스 논리가 문자열의 유효성을 검사하고 가장 빠른 기회에 열거 형으로 변환하는 것입니다.

속성을 결합하려면 어떻게해야합니까?setAttribute

  • 를 사용하여 여러 번 호출 : 나는 적어도 세 가지 옵션을 생각할 수

.

  • 특성 배열을 전달하십시오.
  • 각 열거 형 값을 2의 거듭 제곱으로 정의한 다음 열거 형을 |과 결합 할 수 있습니다.
  • +0

    강하게 입력 된 방식으로이 후자의 방법을 수행 할 수 있습니까? – romeovs

    +0

    @romeovs : 나는 그렇게 생각하지 않는다. 결과적으로 나는 그 옵션에 덜 열중한다. –

    +0

    나는 이것을 수정하기 위해'std :: initializer_list '를 사용하고 있습니다! – romeovs

    3

    예,이 경우 enum을 사용하면 실제 문자열보다 나은 것 같습니다.

    하나의 명확한 장점 - 강력한 타이핑.

    setColor가 귀하의 경우와 같은 char*을 수락하면, 당신이 할 수 있습니다 : 당신은 런타임 오류로 검출 할 수

    a.setColor("horse"); 
    

    .

    a.setColor(eGreen); 
    a.setColor(eRed); 
    

    컴파일,하지만

    a.setColor(eHorse); 
    

    않을 것 : setColor 만약

    는 매개 변수로 eColors합니다. 귀하의 경우에는

    0

    이 경우에는 열 (Enum)이 문자열보다 분명합니다. 가치의 연결에 관해서는, 당신은이 일을하기 위해 약간의 바이올린을 사용할 수 있습니다. 열거 형의 값을 2의 멱승으로 설정 한 다음 함께 OR 할 수 있습니다.

    enum TextAttributes { 
        Bold = 1, 
        Italic = 2, 
        Reverse = 4, 
        StrikeThrough = 8, 
        Underline = 16 
    }; 
    
    TextAttributes attr = Bold | Reverse; 
    
    +0

    이 메서드를 사용하면 열거 형 클래스를 올바르게 사용할 수 없습니까? 이것이 강하게 타이핑 된 것이 아님을 의미합니까? – romeovs

    +0

    수정. 이 접근법에서는 스위치를 사용할 수 없습니다. – JamesWynn

    +0

    @romeovs 범위가 지정된 열거 형을 사용하는 것이 가능합니다. 비트 연산자를 오버로드 할 수 있습니다. 이것은 많은 상용구를 의미 할 수 있지만 쉽게 재사용 할 수 있도록 리팩터링 될 수 있습니다. –

    관련 문제