2009-11-27 5 views
8

조건부 연산자를 사용하여 개체에 대한 참조를 얻는 데 문제가 있습니다.조건부 연산자 문제

class D 
{ 
    virtual void bla() = 0; 
}; 

class D1 : public D 
{ 
    void bla() {}; 
}; 

class D2 : public D 
{ 
    void bla() {}; 
}; 

class C 
{ 
public: 
    C() 
    { 
     this->d1 = new D1(); 
     this->d2 = new D2(); 
    } 

    D1& getD1() {return *d1;}; 
    D2& getD2() {return *d2;} 
private: 
    D1 *d1; 
    D2 *d2; 
}; 

int main() 
{  
    C c;  
    D& d = (rand() %2 == 0 ? c.getD1() : c.getD2());  
    return 0;  
} 

컴파일이 나에게 다음과 같은 오류 제공 : 나는이 비슷한 설정을 가지고 나는 이것이 C에 따라 불법 이해

WOpenTest.cpp: In function 'int 
main()': WOpenTest.cpp:91: error: no 
match for conditional 'operator?:' in 
'((((unsigned int)rand()) & 1u) == 0u) 
? c.C::getD1() : c.C::getD2()' 

++ 표준 (as seen in this blog post을),하지만 난 돈 조건 연산자를 사용하지 않고 D에 대한 참조를 얻는 방법을 알지 못합니다.

아이디어가 있으십니까? 두 가지 내 D&

답변

14

주연 :

D& d = (rand() %2 == 0 ? static_cast<D&>(c.getD1()) : static_cast<D&>(c.getD2())); 
+0

네, 이것은 완벽하게 작동합니다. – laura

+1

여기에는 캐스트 중 하나만 필요하기 때문에 표현이 조금 덜 장황 해집니다. –

+0

@ 리차드, 좋은 메모. 필자가 두 피연산자 모두에 캐스트를 적용하면 쉽게 보일 수 있지만 물론 맞습니다. 컴파일러가 다른 하나를 암시 적으로'D &'로 변환 할 수 있도록 캐스트 하나만으로 충분합니다. –

2

가, BTW 당신이 정말로 조건부 연산자를 사용할 필요가 없습니다,

D* dptr; if(rand() %2 == 0) dptr = &c.getD1(); else dptr = &c.getD2(); 
D& d = *dptr; 

도 작동합니다.

+0

이것은 약간 낭비 일 것 같습니다. 이 접근 방식에 대한 이점과 삼항 연산자에 대한 이점이 있습니까? –

+0

사실입니다. 그러나이 작업을 수행하면 참조가 깔끔하게 보입니다. – laura

+1

Stephen, 나는 OP의 응답에 대해서만 답을 제공하고 있었지만 "삼항 연산자를 사용하지 않고 D에 대한 참조를 얻는 방법을 모르겠다" –

0

또는 함수의 반환 유형을 기본 클래스로 변경할 수 있습니다.

+0

이것은 동적 캐스트가있는 두 게터를 사용하여 코드의 나머지 부분을 후 처리합니다. 실제로는 해결책이 아닙니다. – laura

+0

static_cast가 올바르게 작동해야합니다. – shyam