4

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

这是代码:

Node getSmallest() {

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

    // some other code
}
4

4 回答 4

7

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

于 2013-08-04T12:41:06.833 回答
6

是的。你可以抛出异常。

于 2013-08-04T12:39:05.900 回答
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设置一个标志来表示错误。

于 2013-08-04T12:46:07.933 回答
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
}

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

于 2013-08-04T12:50:47.697 回答