返回对象类型但返回并检查null的类

时间:2017-05-13 20:21:02

标签: c++ object return-value

我是C ++的新手,我正在开发一个项目,我的方法声明如下:

SupportTicket SupportProcessor::getSupportTicket(int supportRef)

上面的方法在数据库中查找记录,如果找到则返回类型为SupportTicket的对象。但是,如果现在找到它,或者因为找不到supportRef,或者由于数据库错误,我想要什么都不返回,即NULL。虽然该方法本身并不抱怨,但当我检查返回的值是否为NULL时,我得到一个错误。

例如,我调用的方法如下:

SupportTicket supportTicket = this->getSupportTicket(1);
if (supportTicket != NULL)
{
   //The record was found
}
else
{
   //The record was not found or an error occurred
}

我要回的错误是:

no operator "!=" matches these operands
binary '!=' no operator found which takes a left-hand operand of type 'SupportTicket' (or there is no acceptable conversion)

在getSupportTicket方法中,我尝试过返回NULL和nullptr

我来自C#背景,所以这通常都很好,所以我怎样才能在c ++中这样做。我知道在方法中,我可以通过执行return new SupportTicket()然后在它返回的方法中删除它来在堆上分配返回值,但这似乎有点矫枉过正,或者这是唯一的方法它。

1 个答案:

答案 0 :(得分:2)

首先,错误。这可能是由于您的SupportTicket课程无法与NULLnullptr进行比较。我甚至无法弄清楚如何从您的函数中返回 null ticket ,因为它无法从您发布的代码中轻易推断出来。
无论如何,C ++与C#或Java等其他语言有很大不同,你不能简单地从函数返回一个空引用来表示你不想/你不能返回指定类型的对象。

如果SupportTicket支持两种有效状态,例如正确初始化肯定未初始化,则可以为该类定义operator bool()或一个isValid成员函数,并直接在守卫中使用它们:

if(myTicket) {
    // ...
}

或者:

if(myTicket.isValid()) {
    // ...
}

在C ++ 17中,您可以使用std::optional代替返回类型:

  

类模板std :: optional管理一个可选的包含值,即可能存在或不存在的值。

它有operator bool()来测试对象是否已正确初始化。有关详细信息,请参阅链接的文档。

在C ++ 11/14中,您可以使用std::unique_ptr<SupportTicket>并在发生故障时返回未初始化的指针。缺点是您必须在动态存储上创建对象本身。如果对你好或不好,主要取决于实际问题,我不能这么说 否则,您可以在github上查找std::optional的替代实现(here是一个示例)或者如果您的编译器提供它,请参考<experimental/optional>
一个稍微不那么用户友好的解决方案是抛出一个异常,但它会强制调用者在try/catch块中嵌入任何invokation,而且它通常很烦人。