有没有办法返回null而不是自定义对象(不是指针)?

时间:2013-08-04 12:37:15

标签: c++ class pointers null

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

以下是代码:

Node getSmallest() {

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

    // some other code
}

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:6)

是。你可以抛出异常。

答案 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标志来表示错误。

答案 3 :(得分:2)

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对象中为字段a分配值-1。如果-1不符合您的目的,您可以选择一个您从不使用的值。 如果节点中有多个字段,则可以使用值的组合表示NULL_NODE。

编辑:正如innosam指出的那样,你也可以(并且可能更好)在Node类中添加一个布尔字段来表示节点是否为NULL或者是其中之一。

如上所述,您现在可以像这样实现您的功能:

Node getSmallest() {

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

   // some other code
}

否则,您可以使用允许您执行相同操作的第三方工具。 有关此案例,请参阅其他人的答案。