2012-09-16 2 views
1

나는 다음과 같은 코드를했다고 가정 :지도 클래스에 열거 네임 스페이스

내가 TODO 섹션에 넣을 수있는 코드의 어떤 종류의
namespace foo { 
    enum bar 
    { 
    fooBarA, 
    fooBarB 
    }; 
} 

struct baz 
{ 
    // TODO: map "bar" in this struct to make valid: 
    bar returnSomething() { return fooBarA; } 
}; 

// and also this: 
void doSomething() 
{ 
    baz myBaz; 

    if(baz::fooBarA == myBaz.returnSomething()) 
    { /* ... */ } 
} 

나머지가 유효하게? 일부 using 또는 typedef?

PS : 대한 질문을 피하기 위해 "왜"네임 스페이스는 자신의 헤더 파일에 거주하고 fooBarAfooBarB의 가치에 동의하지만, 또한 근거가 있음을 숨길해야 할 몇 가지 다른 클래스에 의해 사용될 수 을 사용하는 사람에게는 해당 사항이 없으므로 foo에 있습니다.

PPS : C++ 11이 허용됩니다. enum class 도움이 될까요?

PPPS : using declaration with enum? 같은 다른 질문은 enum이 클래스에 있고 네임 스페이스에 직접없는 경우를 처리합니다.

+0

foo :: bar라고 할 수 있습니까? – Vikdor

+0

예,'foo :: bar'는 작동 할 것이지만'bar '가'baz'의 사용자에게'baz'의 "회원"이 아니라는 사실을 숨길 수는 없습니다. 다른 말로 표현하자면,'바 '를'바스'의 정회원처럼 보이게하고 싶습니다. – Chris

답변

1

이 방법은 foo 네임 스페이스에서 약간의 작업이 필요합니다. 그러나 foo :: bar의 기존 사용자에게는 투명해야합니다. 그냥 foo에 동봉 :: 바의 값을 사용자의 바즈 클래스 파생되는 일부 구조체에 :

namespace foo { 
    struct barValues 
    { 
    enum Values { 
     fooBarA, 
     fooBarB 
    }; 
    }; 

    typedef barValues::Values bar; 
    static const bar fooBarA = barValues::fooBarA; 
    static const bar fooBarB = barValues::fooBarB; 
} 

struct baz : foo::barValues 
{ 
    typedef foo::bar bar; 
    bar returnSomething() { return fooBarA; } 
}; 

// and also this: 
void doSomething() 
{ 
    baz myBaz; 

    if(baz::fooBarA == myBaz.returnSomething()) 
    { /* ... */ } 
    if(foo::fooBarA == myBaz.returnSomething()) 
    { /* ... */ } 
} 
다른 대답을 통해 그것의 장점은 네임 스페이스 foo는 당신의 foo는 :: 바 값을 묶어야한다는 것입니다

- 단지가 추가/수정을 /이 열거 형 값을 삭제하십시오. 이것은 내가 믿기에 더 안전합니다. 다른 대답과 비교할 때의 단점은 옵션이 될 수없는 다른 파일을 수정해야한다는 것입니다.

+0

내가 원했던 좋은 해결책은 아니지만 가능한 최선의 방법 일 것입니다. – Chris

+0

나는 이것에 대해 생각하고 있었지만 더 나은 것을 찾을 수 없었다. 어쩌면,이 구문으로 시작한다면 :'namespace foo {struct bar {enum Values ​​{A, B}; }; }''foo :: bar :: A'를 모든 곳에서 사용하지만'baz'는'baz :: A'로 사용합니다. 똑똑할지 모르지만 모든 이름을 두 번 다시 입력 할 필요는 없었습니다. – PiotrNycz

0

struct baz 
{ 
    typedef foo::bar bar; 
    static const bar fooBarA = foo::fooBarA; 
    static const bar fooBarB = foo::fooBarB; 

  // This is now valid 
  bar returnSomething() { return fooBarA; } 
}; 

를 작동합니다하지만 정말 유용 나도 몰라. 사용자가 일부 기능이나 무언가를 과부하하려고하면 놀랄 것입니다.

+0

유지 관리 성이 나쁜 것은 무엇보다 나쁘다. 누군가 foo :: bar를 수정하면 baz도 변경해야합니다. 컴파일러는 foo :: bar의 요소를 줄이거 나 변경하는 것에 대해 알려주지 만 foo :: bar를 확장하는 것에 대해서는 말하지 않습니다. – PiotrNycz

+0

그럴 수는 있지만 꽤 유용하지는 않습니다. 'bar'에는 두 가지 값이 아니라 100 가지 색상이 있다고 상상해보십시오. 그런 다음 해당 열거 형을 사용하는 모든 클래스는 값을 정의하는 추가 100 줄이 필요합니다. – Chris

+1

@Chris - 맞습니다.별로 유용하지 않습니다. 다른 한편으로는 각 값을 별도로 언급하지 않고 열거 형 값을 "가져 오는"방법에 대해서는 알지 못합니다. 그것들은 패키지가 아닌 개인적인 가치입니다. –

관련 문제