NULL检查qt中的整数

时间:2015-07-09 07:56:09

标签: c++ qt

我在一个由多个类继承的纯虚拟类中有一个函数。此功能类似于:

virtual quint32 myClass::getIntValue() = 0

在某些继承此函数的类中,应返回默认值,因为它们尚未实现此功能。但是,我选择的任何quint32也可以是有效的返回值。因此,例如,如果我选择“0”作为默认值,我可以检查返回值为“0”并相应地采取行动(例如忽略该值)。然而,有些情况下“0”将是有意义的有效返回值。

有没有解决这个问题的方法?

3 个答案:

答案 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,另一种方法是实现一些轻量级可选值类。

相关问题