【问题标题】:Class returning an object type but how can null be returned and checked返回对象类型的类,但如何返回和检查 null
【发布时间】:2017-10-12 22:44:50
【问题描述】:

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

【问题讨论】:

  • 如果方法返回一个对象,它不能返回NULLNULL 是一个指针值。你可以让它抛出一个异常。或者让它返回一个unique_ptr<SupportTicket>

标签: c++ object return-value


【解决方案1】:

首先,错误。这可能是因为您的SupportTicket 类既不能与NULL 也不能与nullptr 进行比较。我什至无法弄清楚你是如何从你的函数中返回一个 null 票的,因为它不能轻易地从你发布的代码中推断出来。
无论如何,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 块中,这通常很烦人。

【讨论】:

    猜你喜欢
    • 2011-07-09
    • 1970-01-01
    • 2020-11-25
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多