2009-11-27 13 views
8

Ich habe Probleme mit dem Bedingungsoperator, um eine Referenz auf ein Objekt zu erhalten. Ich habe die eine Einrichtung ähnlich wie diese:Bedingtes Problem mit dem Operator

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;  
} 

Beim Kompilieren, das gibt mir die folgende Fehlermeldung:

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()' 

Ich verstehe dies nach dem C illegal ++ Standard (as seen in this blog post), aber ich don weiß nicht, wie ich meine Referenz auf D bekomme, ohne den bedingten Operator zu benutzen.

Irgendwelche Ideen?

Antwort

14

Cast D& in beiden Zweigen:

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

Ja, das funktioniert perfekt. – laura

+1

Sie brauchen auch nur einen der Casts, was den Ausdruck ein bisschen weniger ausschweifig macht. –

+0

@Richard, ah gute Nachricht. Für mich sieht es einfacher aus, wenn ich die Umwandlung auf beide Operanden anwende, aber Sie haben natürlich recht, eine Umwandlung genügt, damit der Compiler sieht, dass die andere implizit in "D &" konvertiert werden kann. –

2

Btw, die Sie nicht wirklich einen bedingten Operator verwenden müssen,

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

würde auch funktionieren.

+0

Das sieht etwas verschwenderisch aus. Gibt es einen Vorteil gegenüber dem ternären Operator? –

+0

Das ist richtig, aber ich finde den Code klobig, wenn Sie dies tun (mit der Referenz sieht sauberer). – laura

+1

Stephen, ich gab nur eine Antwort auf OPs Antwort, "aber ich weiß nicht, wie ich meine Referenz auf D bekommen kann, ohne den ternären Operator zu verwenden" –

0

Oder Sie können die Rückgabetypen der Funktionen in Basisklasse ändern.

+0

Dies würde den Rest des Codes mit den beiden Gettern mit dynamischen Güssen pfeffern, es ist nicht wirklich eine Lösung – laura

+0

Sie haben Recht, static_cast sollte funktionieren. – shyam