类返回对象类型,但如何返回和检查 null

Class returning an object type but how can null be returned and checked

本文关键字:返回 检查 null 类型 对象 何返回      更新时间:2023-10-16

我对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()然后在返回到的方法中删除它来分配堆上的返回值,但这似乎有点矫枉过正,或者这是唯一的方法。

首先,错误。这可能是因为您的SupportTicket类既不能与NULL进行比较,也不能与nullptr进行比较。我什至无法弄清楚您如何从函数中返回空票证,因为它无法从您发布的代码中轻松推断出来。
无论如何,C++与 C# 或 Java 等其他语言非常不同,您不能简单地从函数返回 null 引用来指示您不想/不能返回指定类型的对象。

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

if(myTicket) {
// ...
}

或:

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

在 C++17 中,您可以改用std::optional作为返回类型:

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

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

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