검색결과 리스트
Enum에 해당되는 글 3건
- 2016.04.19 [C++] Better Enum 라이브러리 소개
- 2012.07.27 [ VC11-C++11 ] enum - 전방선언
- 2012.07.19 [ VC11-C++11 ] enum - unscoped enumeration과 scoped enumeration
C++ 프로그래밍 할 때 enum을 자주 사용한다.
그런데 C++ enum은 다른 언어의 enum에 비해서 부족한 부분이 많다.
특히 enum으로 선언한 것을 문자열로 바로 변환할 수 없어서 보통 수작업으로 직접 선언하거나 #define 등을 통해서 유틸리티를 만든다.
Better Enum 라이브러리는 우리가 기존에 귀찮게 했던 것을 대신 해준다.
이 라이브러리를 사용하면 enum을 이전 보다 더 편하게 사용할 수 있다(사실 다른 언어는 기본 지원하는 것이지만^^;)
아래 문서는 NEXT의 게임 클라이언트/서버 과정에서 학생이 정리한 것이다.
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 enumeration과 scoped 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 이나 MONK는 CHARACTER_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;
}
댓글