说我有两个从一个共同的基础继承的类,例如
class Thing{
public:
virtual int f()=0;
};
class Thing_variant_a: public Thing{
public:
int f(){
std::cout<<"I am (a)"<<std::endl;
}
};
class Thing_variant_b: public Thing{
public:
int f(){
std::cout<<"I am (b)"<<std::endl;
}
};
以及一个将对Thing
对象的引用作为参数的函数。
void function(Thing& t){
t.f();
}
根据条件,我想用function
或thing_a
来调用thing_b
(并且可能在某个时候扩展它,从而增加thing_c
的另一种可能性)
我知道我可以使用指针来做到这一点
Thing *t = nullptr;
if(condition_a){
t = new Thing_variant_a();
} else if(condition_b){
t = new Thing_variant_b();
}
function(*t);
但是,我想知道是否还有更好的方法
不分配堆内存
不需要我在某些时候删除t
(可能是智能指针,但是我对此不太了解)
确保我总是将有效的Thing
引用传递给函数(在复杂的结构中可能比在此最小示例中有更多的条件)我可以执行if(t){ function(*t);}else{/*handle error*/}
),但似乎应该有一个更优雅的选择解决方案。
如果不是以上所有内容都可以将它们组合在一起吗?
这是一种无需使用堆或指针的方法:
Thing_variant_a thingA;
Thing_variant_b thingB;
if(condition_a){
function(thingA);
} else if(condition_b){
function(thingB);
}
如果需要,可以通过三元运算符使其更简单:
Thing_variant_a thingA;
Thing_variant_b thingB;
function(condition_a ? static_cast<Thing &>(thingA) : static_cast<Thing &>(thingB));