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

コンパイルすると、次のエラーが発生します。

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

これはC++標準(このブログ投稿に見られるように)によれば違法であることを理解していますがD、条件演算子を使用せずに参照を取得する方法がわかりません。

何か案は?

4

3 に答える 3

14

D&両方のブランチ内にキャストします。

D& d = (rand() %2 == 0 ? static_cast<D&>(c.getD1()) : static_cast<D&>(c.getD2()));
于 2009-11-27T08:55:33.770 に答える
2

ところで、条件演算子を実際に使用する必要はありません。

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

もうまくいくでしょう。

于 2009-11-27T09:24:41.793 に答える
0

または、関数の戻りタイプを基本クラスに変更できます。

于 2009-11-27T09:48:36.093 に答える