【问题标题】:Is there a way to return null instead of custom object (not pointer)?有没有办法返回 null 而不是自定义对象(不是指针)?
【发布时间】:2013-08-05 06:23:45
【问题描述】:

有没有办法在不使用指针或引用的情况下做我想做的事情?

代码如下:

Node getSmallest() {

    if (openList.empty())
        return 0;         // syntax error

    // some other code
}

【问题讨论】:

  • 节点是类还是 typedef?让你的问题更清楚,好吧0不是节点,所以报错
  • 除非有一个值 Node 可以采用表示 null 的值。你可以返回一个可选对象(例如boost::optional<Node>

标签: c++ class pointers null


【解决方案1】:

您可以使用boost::optional 返回一个可选值。或者等待 C++14 并使用std::optional

【讨论】:

  • 为什么要等?自己实现很容易。
【解决方案2】:

是的。你可以抛出异常。

【讨论】:

  • 同意。尝试获取空集的最小元素不是预期的情况,没有合理的对象可以返回,因此异常实际上是最好的出路。
【解决方案3】:

当您的代码成功时,您似乎想返回Node 对象的副本。

struct Node{
    int a;
    bool isEmpty_;
    Node(bool isEmpty):isEmpty_(isEmpty)
};

Node getSmallest() {

    if (openList.empty())
        return Node(false);

    // some other code
}

没有其他办法,您必须返回一个对象,该对象内部可以设置一个 isEmpty 标志来表示错误。

【讨论】:

  • 我建议避免使用isEmpty_ 成员并使用boost::optional<Node>。这样可以避免混淆类逻辑。
【解决方案4】:

getSmallest() 函数的返回类型定义为 Node 对象,在 C++ 中意味着 返回的表达式必须是 Node 类型,并且在运行时返回的对象的内存将被复制回调用者。

因为,你不能返回整数 0。

相反,您可以做的是为 Node 定义一个特定的实例对象,它表示一个 NULL 节点。这基本上取决于Node的定义,假设如下:

class Node {
   // Some representative field
   int a;

   // Some basic constructor
   Node(int a){ 
      this->a = a; 
   }
}

您可以通过以下方式定义 NULL 节点:

class Node {
   // Some representative field
   int a;

   // Some basic constructor
   Node(int a){ 
      this->a = a; 
   }

   static Node NULL_NODE(-1);
}

上面的示例假设您实际上从不在其他 Node 对象中将值 -1 分配给字段 a。如果 -1 不符合您的目的,您可以选择一个您假定永远不会使用的值。 如果节点中有多个字段,可以用值的组合来表示 NULL_NODE。

编辑:正如 innosam 指出的那样,您还可以(并且可能更好)向 Node 类添加一个布尔字段来表示该节点是否为 NULL 或任何一个。

有了上面所说的,你现在可以像这样实现你的函数了:

Node getSmallest() {

   if (openList.empty())
      return Node.NULL_NODE;         // syntax error

   // some other code
}

否则,您可以使用第三方工具来做同样的事情。 此案例参考其他人的回答。

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 2022-01-22
    • 2019-10-13
    • 1970-01-01
    • 2019-10-22
    • 2015-04-13
    • 2010-12-01
    • 2019-06-12
    相关资源
    最近更新 更多