我是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()
然后在它返回的方法中删除它来在堆上分配返回值,但这似乎有点矫枉过正,或者这是唯一的方法它。
答案 0 :(得分:2)
首先,错误。这可能是由于您的SupportTicket
课程无法与NULL
或nullptr
进行比较。我甚至无法弄清楚如何从您的函数中返回 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,而且它通常很烦人。