我在使用条件运算符获取对象的引用时遇到了一些麻烦。我有类似的设置:
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 ++标准(as seen in this blog post),这是非法的,但我不知道如何在不使用条件运算符的情况下获取D
的引用。
有什么想法吗?
答案 0 :(得分:14)
在两个分支内投射到D&
:
D& d = (rand() %2 == 0 ? static_cast<D&>(c.getD1()) : static_cast<D&>(c.getD2()));
答案 1 :(得分:2)
顺便说一下,你真的不需要使用条件运算符,
D* dptr; if(rand() %2 == 0) dptr = &c.getD1(); else dptr = &c.getD2();
D& d = *dptr;
也可以。
答案 2 :(得分:0)
或者您可以将函数的返回类型更改为Base Class。