2015-01-06 3 views
0

MainClass.h :C++ : 어떤 네임 스페이스에서 같은 클래스 이름을 가진 객체를 받아들이도록 함수를 얻는 방법?

namespace Alpha{ enum class Parameters; } 
namespace Beta { enum class Parameters; } 
MainClass{ 
public: 
    enum class Type{ Type_A, Type_B }; 
    MainClass(const Type t); 

    void DoStuff(const Parameters p); 
private: 
    void doesStuff(const int p_val); 
}; 

MainClass.cpp : 내가 할 수 있도록하고 싶습니다 무엇

/* define values for Alpha::Parameters, Beta::Parameters here or elsewhere, and included */ 
MainClass::MainClass(const Type t){ 
    /* not sure how to do this. But essentially by switching based on 't' use either Alpha::Parameters or Beta::Parameters */ 
} 

MainClass::DoStuff(const Parameters p){ 
    int p_value = static_cast<int>(p); 
    doesStuff(p_value); 
} 

. 이것이 가능한가? 실제로 enum 클래스이 계승 클래스로 동작한다면 좋겠지 만, 그럴 수는 없다는 것을 알고 있습니다. 내가 이것을 재 작성하려고 시도할수록 각 사례에 대해 특정 클래스를 작성해야 할 때까지 나선형을 유지할 수 있습니다 (예에서 두 개 이상을가집니다). 그러나 코드는 모두 매우 비슷합니다.

는 또한 그냥 DoStuff (CONST의 INT의 p_val) 수를 외부 정적 캐스트를 할 ...하지만 그때 나는 모든해야 할 (CONST이 페이지 매개 변수) 대체 그냥 DoStuff을 허용하는 것입니다 알고 다른 곳에서는 정적 캐스팅을 사용하고 있으며 enum 클래스에 대한 좋은 typechecking을 얻지 못했습니다.

가능하지 않다면 괜찮습니다 ... 그렇다면 너무 나쁩니다.

+0

모든 가능한 값을 가진 단일 열거 형을 가질 수는 없지만 런타임시 특정 값이 허용되는지 여부를 확인하고 예외를 throw하거나 값이 허용되지 않으면 오류를 반환 할 수 있습니까? –

+0

'Alpha :: Parameters'와'Beta :: Parameters'는'Alpha_Parameters'와'Beta_Parameters'와 다르므로 네임 스페이스는이 이야기와 무관합니다. 어떤 열거 형이나 어떤 미리 정의 된 집합의 열거 형을 전달할 수 있기를 원할 수 있습니다. 두 경우 모두 더 쉬운 솔루션이 있습니다. 어쩌면 열거 형 작업에 대한 올바른 도구가 아닙니다. –

답변

3

템플릿을 사용해 보셨습니까?

필요한 경우 각 매개 변수 유형에 대한 전문화를 제공 할 수 있습니다.

생성자에서 T를 결정하는 데 대한 첫 번째 부분을 놓쳤습니다. 일반적으로 나는이 같은 클래스 템플릿을 구현하는 것 :

#include <iostream> 

namespace Alpha{ enum class Parameters { A, B, C }; } 
namespace Beta { enum class Parameters { a, b, c }; } 

template < typename P > 
class MainClass{ 
public: 
    MainClass() { } 

    void DoStuff(const P p) { 
     int p_value = static_cast<int>(p); 
     doesStuff(p_value); 
    } 

private: 
    void doesStuff(const int p_val) { 
     std::cout << "DoesStuff " << p_val << std::endl; 
    } 
}; 

int main(int argc, const char** argv) { 

    MainClass<Alpha::Parameters> alpha; 
    alpha.DoStuff(Alpha::Parameters::A); 
    alpha.DoStuff(Alpha::Parameters::B); 
    alpha.DoStuff(Alpha::Parameters::C); 
    MainClass<Beta::Parameters> beta; 
    beta.DoStuff(Beta::Parameters::a); 
    beta.DoStuff(Beta::Parameters::b); 
    beta.DoStuff(Beta::Parameters::c); 
    return 0; 
} 

을하지만, DoStuff이 유일한 부분이있는 사용하는 매개 변수에 의존하는 경우, 나는 템플릿 기능을 사용하십시오.

+0

아, 그래,이게 나를 위해 잘 될거야. 템플릿 외부에 템플릿을 두는 것에 대해 생각하지 않았습니다. 'DoStuff'와 같은 특정 기능을 중심으로 고려해 보았지만 수업 전후로 내가 원하는 부분을 정확하게 생각할 수 있습니다. 감사. – shavera

+0

실제로 클래스 내부에 템플릿 함수가 있어야합니다. 유일한 공용 인터페이스는 기본 정수 표현이 아니라 열거 형을 기반으로하기 때문에 보호 기능이 가장 좋습니다. dan-O의 가정에 대한 의견은 여전히 ​​적용되지만, 이는 당신이 설명하는 것을 성취하는 데 도움이 될 것입니다. – Jason

+0

흠, 고마워, 나는 두 가지 의견이 모두 다루고있는 것을 이해한다. 그러나 실제 예제에서 게시 된 코드로의 추상화에서 템플릿 스타일 클래스의 사용을 선호하는 일부 미묘함이 사라졌습니다. 약간 덜 일반적인 경우 (내가 직면 한 것)에 대해 '패킷'은 패킷의 유형에 따라 일부 헤더 정보가있는 일반 데이터 컨테이너입니다. 헤더는 패킷과 패킷이 약간 다릅니다. 특정 매개 변수가 저장 될 위치의 바이트 인덱스 인 'parameters'섹션에 캡슐화하려고합니다. (cont 'below) – shavera

1

함수 오버로딩과 최소한의 함수 본문 코드로이를 수행 할 수 있습니다.

MainClass::DoStuff(Alpha::Parameters p){ 
    int p_value = static_cast<int>(p); 
    doesStuff(p_value); 
} 
MainClass::DoStuff(Beta::Parameters p){ 
    int p_value = static_cast<int>(p); 
    doesStuff(p_value); 
} 
MainClass::DoStuff(Etcetera::Parameters p){ 
    int p_value = static_cast<int>(p); 
    doesStuff(p_value); 
} 

그리고 모든 구현은 doesStuff() 기능에있을 것입니다.

이렇게하면 다른 열거 형을 사용하는 기존 함수 호출을 유지할 수 있습니다.

그러나이 typechecking은 생각만큼 가치가 없을 수도 있습니다 ...이 코드는 모든 열거 형을 동일하게 유지한다고 가정합니다. 베타 :: 매개 변수 열거 형 중 하나만 변경하면이 코드가 손상되고 경고없이 버그가 도입됩니다.

+0

예, 사실입니다. 더 효율적인 방법이 있는지 궁금합니다. 나는 실제 시나리오에서 사용할 "매개 변수"의 약 2 * 6 종류를 가지고 있으며 12 배의 과부하 기능을 가지고있는 것처럼 보였습니다 ... 기껏해야 지루한 것 같았습니다. 위의 Jason의 의견에 따르면 Templatized가 더 나을 수도 있습니다. – shavera