2013-10-29 4 views
3

예제 코드 :열거 형 내에 열거 형을 사용할 수 있습니까?

#ifndef SPELL_ENUMS_H 
#define SPELL_ENUMS_H 

namespace spellEnums { 
     // Cantrips 
    enum LEVEL_ZERO 
    { 
     enum EVOCATION 
     { 
      _DANCING_LIGHTS 
     }; 
     enum CONJURATION 
     { 
      _ACID_SPLASH 
     }; 
    }; 

}; 

그래서 내가 LEVEL_ZERO :: 환기 같은 물건을 할 수 있습니다 : _ DANCING_LIGHTS?

모든 300+ 3.5e 던전과 드래곤 유형을 쉽게 읽을 수 있고 편리하게 접근 할 수 있도록 정의 된 대체 제안은 크게입니다. : D

을 또는 내가 좋아하는 절름발이 네임 스페이스 지정 어떻게해야합니까 :

namespace LEVEL_ZERO { 
     // Cantrips 
     enum EVOCATION 
     { 
      _DANCING_LIGHTS 
     }; 
     enum CONJURATION 
     { 
      _ACID_SPLASH 
     }; 

}; 

namespace LEVEL_ONE { 
     // Level one spells 
     enum EVOCATION 
     { 
      _FLAMING_HANDS 
     }; 
     enum CONJURATION 
     { 
      _MAGE_ARMOUR //BECAUSE JE SUIS CANADIEN le poutine eh?! 
     }; 

}; 

또는 것이 원인 이상한 문제?

+3

(http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore -in-ac-identifier). – chris

+0

그들은 "BLARGH IS AMBIGUOUS"문법 오류를 피하기 위해 개인 변수 명명 체계 일 뿐이므로 결코 이해할 수없는 것입니다. 링크 된 페이지가 내 질문에 대답하지 않는 것 같습니다. – RaenirSalazar

+0

링크의 핵심은 일반 프로그램이 컴파일러 공급 업체를 위해 예약되어 있기 때문에 밑줄로 시작하는 이름을 사용하지 않아야한다는 것을 보여주는 것입니다. 컴파일러에서 라이브러리 파일 중 하나를 열면,'_rb_tree_node'와 같은 식별자로 채워진다. 'rb_tree_node'라는 이름을 사용하여 자신의 Red-Black Tree를 구현하고자한다면, 표준 libary의 이름과 충돌하지 않도록 이름을 지정합니다. –

답변

0

당신이 정말로 원하는 경우 중복되어 주문과 별도의 열거에 대한 고유 ID를 필요가 있다고 생각하기 때문에 좋지 않다

... 유형을 주문하지 이 일을 수행하려면 을 사용하고 enum을 사용하지 않아야한다고 생각합니다. enum 이름이 정도의 경우에는, 범위 취급되는 것은 아니다 :

namespace LEVEL_ONE { 
    // Level one spells 
    enum EVOCATION 
    { 
     FLAMING_HANDS 
    }; 
    enum CONJURATION 
    { 
     MAGE_ARMOUR //BECAUSE JE SUIS CANADIEN le poutine eh?! 
    }; 
}; 

값은 형태 LEVEL_ONE::FLAMING_HANDS하지 LEVEL_ONE::EVOCATION::FLAMING_HANDS에서 언급 될 것이다. 난 당신이 당신이 제안했던 방법으로 enum를 사용하여 얻을 것이 무엇 인 값 어쨌든 다른 유형을 할 것인지 생각하지 않는다

namespace LEVEL_ONE { 
    // Level one spells 
    namespace EVOCATION 
    { 
     const int FLAMING_HANDS = 0; 
     const int MAGIC_MISSILE = 1; 
    }; 
}; 

: 당신은 같은과 원하는 효과를 얻을 수 있습니다. 모든 다른 학교와 레벨의 주문에 대해 별도의 유형을 사용하는 대신 모든 주문을 참조 할 수있는 Spell (또는 이와 유사한) 유형의 객체를 전달하려고합니다. 아마 같은쪽으로 경향이있다 : 당신은 [예약 식별자]를 사용하고

class Spell 
{ 
public: 
    enum Magic_Type 
    { 
     ARCANE, 
     DIVINE 
    }; 

    enum School 
    { 
     EVOCATION, 
     CONJURATION, 
     DIVINATION, 
     ... 
    }; 

    int get_level(); 
    Magic_Type get_type(); 
    School get_school(); 
    void cast_on(Target &t, Board &b); // Needs the Board to affect secondary targets. 
    ... 
}; 
+0

내가 구현할 수있는 모든 주문을 갖고 싶다고 가정하면; 예를 들어 마법사 레벨의 모든 사용 가능한 주문의 레벨 업에 마법사 캐릭터의 "사용 가능한 주문"메뉴를 채웠을 때? 편집 : 생각해 보면, 내가 발견 한 문제는 그 중 많은 것을 구현할 수 있다고 가정 할 때 약 300 개의 주문을 정의해야한다는 것입니다. 내 생각에 쉽게 비교할 수 있도록 미리 정의 된 열거 형 변수가있는 300 개의 주문을 생성자에게 전달하는 것이 좋습니다. 그래서 당신이 제안하는 Spell 클래스와 const int 네임 스페이스를 결합하고 미리 만들어진 맞춤법 개체 배열이 있습니까? – RaenirSalazar

+1

나는 당신이 여기서 물어 보려는 질문이 무엇인지 확신하지 못한다. 다음 질문없이 나에게 셋업 ("X를 가정하자")을 주신 것처럼 보인다. 그것이 당신이 어떤 학교 나 레벨의'Spell' 오브젝트를 갖고 싶은지를 묻는다면, 나는 그렇다고 말할 것입니다. –

+0

다음은 이것이 마법을 어떻게 구현할 것인가를 아래에서 분명히 밝히고 싶었습니다. 1. 중간에있는 네임 스페이스 내에는 const int로 정의 된 모든 구현 된 주문이 있습니다. 2. 새 주문 개체를 만들 때마다 수동으로 그 주문을 전달합니다. 따라서, 레벨별로 정렬 할 수있는 모든 주문을 간편하게 목록으로 원하면 SomeSpell_Array의 모든 구현 된 주문에 대해 * Spell (MAGIC_MISSILE, ARCANE, LEVEL_ONE, ETC)의 Spell * mySpell = 새 주문을 선택하십시오. 그리고 캐스팅 될 때 게임 자체에 새로운 맞춤법 개체를 만듭니다. – RaenirSalazar

1

내가 중첩 열거 내가 이런 식 오히려 사용하는 것이 좋은 방법이라고 생각하지 않습니다

enum _spell_enum 
    { 
    _spell_evocation_beg=0x00000000, 
    _spell_dancing_lights0, 
    _spell_dancing_lights1, 
    _spell_dancing_lights2, 
    _spell_dark_shroud0, 
    _spell_dark_shroud1, 
    _spell_dark_shroud2, 
    _spell_..., 
    _spell_evocation_end, 

    _spell_conjuration_beg=0x01000000, 
    _spell_acid_splash0, 
    _spell_acid_splash1, 
    _spell_acid_splash2, 
    _spell_acid_beam0, 
    _spell_acid_beam1, 
    _spell_acid_beam2, 
    _spell_..., 
    _spell_conjuration_end, 

    _spell_teleport_beg=0x02000000, 
    _spell_teleport_home, 
    _spell_teleport_town_a, 
    _spell_teleport_town_b, 
    _spell_teleport_town_c, 
    _spell_teleport_town_d, 
    _spell_..., 
    _spell_teleport_end, 
    }; 

PS가.과 같은 추가 정보가 필요하면 필요한 정보가있는 추가 테이블을 사용하거나 enum 대신 const int를 사용하고 코드에 정보를 직접 코드화 할 수 있습니다 (예 : 레벨이 높거나 낮음 n 비트 일 수 있음). 또는 그룹화 할 수 있습니다 수준으로 열거 또한 두 번째 솔루션 난 당신이 (당신이 시작 값을 제공하지 않는 한)

+0

어디서든'prefix_'를 쓰는 사람은 네임 스페이스를 사용해야한다는 확실한 신호입니다. – MSalters

+0

전역 네임 스페이스에있는 경우 밑줄을 붙일 수 없습니다. – Simple

관련 문제