Search

'scoped enumeration'에 해당되는 글 2건

  1. 2012.07.23 [ VC11-C++11 ] enum - 전방선언
  2. 2012.07.16 [ VC11-C++11 ] enum - unscoped enumeration과 scoped enumeration

[ VC11-C++11 ] enum - 전방선언

C++0x 2012.07.23 09:00 Posted by 흥배

unscoped enumeration scoped enumeration 둘 다 전방 선언을 할 수 있습니다.

 

아래와 같이합니다.

enum ITEMTYPE : short;

enum class CHARACTER_CLASS : short;

 

전방 선언을 할 때 unscoped enumeration은 타입 선언을 생략할 수 없지만 scoped enumeration은 타입 선언을 생략 할 수 있습니다.

 

아래 예제 코드를 보면 전방 선언을 올바르게 사용한 것과 잘못 사용한 예를 볼 수 있습니다.


< TypeDef.h >

 

#pragma once

 

enum ITEMTYPE : short

{

           WEAPON,

           EQUIPMENT,

           GEM                          = 10,

           DEFENSE,

};

 

enum class CHARACTER_CLASS1 : short

{

           WARRIOR                    = 1,     

           MONK,

           FIGHTER,

};

 

enum class CHARACTER_CLASS2

{

           WARRIOR                    = 1,     

           MONK,

           FIGHTER,

};

 

 

 

 

 

< Character.h >

 

#pragma once

 

enum ITEMTYPE : short;

//enum ITEMTYPE;                                          // 에러

//enum class ITEMTYPE : short;                       // 에러

 

 

enum class CHARACTER_CLASS1 : short;

//enum class CHARACTER_CLASS1;                  // 에러

//enum class CHARACTER_CLASS1 : int;           // 에러

//enum CHARACTER_CLASS1 : short;                // 에러

 

 

enum class CHARACTER_CLASS2;

 

 

 

struct Character

{

           ITEMTYPE m_ItemType;

          

           void SetItemType( ITEMTYPE Type );

 

 

           CHARACTER_CLASS1 m_Class;

          

           void SetClass( CHARACTER_CLASS1 CharClass );

};

 

 

 

 

< Character.cpp >

 

#include "Character.h"

#include "TypeDef.h"

 

 

void Character::SetItemType( ITEMTYPE Type )

{

           m_ItemType = Type;

}

 

void Character::SetClass( CHARACTER_CLASS1 CharClass )

{

           m_Class = CharClass;

}

 

 

저작자 표시
신고

C++11(새로운 C++ 표준의 이름) enum은 지금(C++03)과 다르게 두 가지의 enum이 있습니다.

바로 unscoped enumerationscoped enumeration 입니다.

 

 

unscoped enumeration

unscoped enumeration은 기존의 enum과 비슷한 것 이라고 생각 하면 좋을 것 같습니다.^^

 

 

unscoped enumeration은 아래와 같이 정의하고 사용합니다.

 

enum ITEMTYPE : short

{

   WEAPON,

   EQUIPMENT,

   GEM       = 10,

   DEFENSE,      // C++03까지는 에러이지만 C++11에서는 에러가 아님

};

 

사용은 아래와 같이

short ItemType = WEAPON;

 또는

short ItemType = ITEMTYPE::WEAPON; // C++03에서는 에러

 

 


scoped enumeration 

scoped enumeration은 아래와 같이 정의하고 사용합니다.

enum class CHARACTER_CLASS : short

{

           WARRIOR                    = 1,     

           MONK,

           FIGHTER,

};

 

사용은 아래와 같이 합니다.

CHARACTER_CLASS CharClass = CHARACTER_CLASS::WARRIOR;

 

그러나 아래는 에러입니다.

short CharClassType = FIGHTER; // 에러

 

scoped enumeration unscoped enumeration와 다르게 CHARACTER_CLASS를 생략하면 안됩니다. WARRIOR 이나 MONKCHARACTER_CLASS의 범위 안에 있음을 가리킵니다.

 

그리고 enum class 대신 enum struct을 사용해도 괜찮습니다. 타입을 지정하지 않으면 기본으로 int 타입이 됩니다.

 

 

 

형 변환

unscoped enumeration은 기존과 같이 암묵적으로 정수로 변환할 수 있습니다.

int i = WEAPON;

 

그러나 scoped enumeration은 명시적으로 타입 캐스팅을 해야합니다.

int i = static_cast<int>( CHARACTER_CLASS::WARRIOR);

 

 

 

< 예제 >

#include <iostream>

 

// unscoped enumeration

enum ITEMTYPE : short

{

           WEAPON,

           EQUIPMENT,

           GEM                          = 10,

           DEFENSE,

};

 

// scoped enumeration

enum class CHARACTER_CLASS : short

{

           WARRIOR                    = 1,     

           MONK,

           FIGHTER,

};

 

enum struct BATTLE_TYPE : short

{

           DEATH_MATCH              = 1,     

           TEAM,

};

 

int main()

{

           // unscoped enumeration

           std::cout << "ITEM WEAPON Type 번호 : " << ITEMTYPE::WEAPON << std::endl;

 

           short ItemType = EQUIPMENT;

           std::cout << "ITEM EQUIPMENT Type 번호 : " << ItemType << std::endl;

 

 

 

           /// scoped enumerations

           short CharClassType3 = (short)CHARACTER_CLASS::FIGHTER;

 

           CHARACTER_CLASS CharClass = CHARACTER_CLASS::WARRIOR;

          

           //short   CharClassType    = FIGHTER;                                  // 에러                                           

 

           //short   CharClassType2   = CHARACTER_CLASS::FIGHTER; // 에러

          

           //CHARACTER_CLASS       CharClass2    = WARRIOR;            // 에러

                            

           return 0;

}

 

 

저작자 표시
신고