gne*_*iak 7 c++ constructor reference
class Base
{
public:
void operator()() { func(); }
private:
virtual void func() {}
};
class Derived1 : public Base
{
private:
void func() override {/*do something*/}
};
class Derived2 : public Base
{
private:
void func() override {/*do something else*/}
};
Run Code Online (Sandbox Code Playgroud)
因为我想使用运算符重载,所以
Reference是比指针更好的选择.
我打算做的是:
if (condition) {
Base& obj = Derived1();
} else {
Base& obj = Derived2();
}
Run Code Online (Sandbox Code Playgroud)
但是obj将被销毁并且范围结束.
Base& obj;
if (condition) {
obj = Derived1();
} else {
obj = Derived2();
}
Run Code Online (Sandbox Code Playgroud)
也不会工作,
因为引用需要在声明时初始化.
如果我尝试:
Base& obj = condition ?
Derived1() : Derived2();
Run Code Online (Sandbox Code Playgroud)
还是一个错误,因为三元运算符期望可转换类型.
处理这个问题的最佳解决方案是什么?
?:在这种情况下,您不能使用Derived1和Derived2是不同的类型.
一种可能的方法是使用指针,这是有效的:
condition ? pObj.reset(new Derived1()) : pObj.reset(new Derived2());
Run Code Online (Sandbox Code Playgroud)
要么
#include <memory>
std::unique_ptr<Base> pObj;
if (condition)
{
pObj.reset(new Derived1());
}
else
{
pObj.reset(new Derived2());
}
Run Code Online (Sandbox Code Playgroud)
你可以这样打电话operator():
(*pObj)();
Run Code Online (Sandbox Code Playgroud)