我在一个由多个类继承的纯虚拟类中有一个函数。此功能类似于:
virtual quint32 myClass::getIntValue() = 0
在某些继承此函数的类中,应返回默认值,因为它们尚未实现此功能。但是,我选择的任何quint32也可以是有效的返回值。因此,例如,如果我选择“0”作为默认值,我可以检查返回值为“0”并相应地采取行动(例如忽略该值)。然而,有些情况下“0”将是有意义的有效返回值。
有没有解决这个问题的方法?
答案 0 :(得分:3)
使用boost::optional。希望它会被添加到C ++ 17标准中。
答案 1 :(得分:2)
你可以退回QPair或通过bool&像:
virtual quint32 myClass :: getIntValue(bool& valid)= 0;
或
虚拟QPair< quint32,bool> myClass :: getIntValue()= 0;
答案 2 :(得分:1)
如果您可以使用可选类型,请使用它。
否则,由于getIntValue
的调用者无论如何都必须进行检查,因此强制它进行检查会很有用。有一个调用者可以用来检查是否实现了getIntValue
的方法。快速检查这样的API,很明显您需要在使用之前调用hasGetIntValue
。它自我记录的程度并不比使用可选类型差。
class MyClass {
...
virtual quint32 getIntValue() const { Q_ASSERT(false); } // or abort()
virtual bool hasGetIntValue() const { return false; }
};
class Class : public MyClass {
...
quint32 getIntValue() const Q_DECL_OVERRIDE { return 42; }
bool hasGetIntValue() const Q_DECL_OVERRIDE { return true; }
}
然后呼叫者可以检查并完全避免呼叫:
if (myClassInstance.hasGetIntValue()) {
auto value = getIntValue();
...
} else {
// can't call getIntValue(), do something else
}
这种方法可以捕获那些在运行时不进行检查的呼叫者。
请注意,getter通常可以声明为const
,并且应使用Q_DECL_OVERRIDE
声明重新实现,以确保您实际实现现有虚拟方法,而不是添加新方法。
如果您因任何原因无法使用boost::optional
,另一种方法是实现一些轻量级可选值类。