有没有办法在不使用指针或引用的情况下做我想做的事情?
这是代码:
Node getSmallest() {
if (openList.empty())
return 0; // syntax error
// some other code
}
您可以使用它boost::optional
来返回一个可选值。或者等待 C++14 并使用std::optional
.
是的。你可以抛出异常。
Node
当您的代码成功时,您似乎想返回对象的副本。
struct Node{
int a;
bool isEmpty_;
Node(bool isEmpty):isEmpty_(isEmpty)
};
Node getSmallest() {
if (openList.empty())
return Node(false);
// some other code
}
没有其他方法,您必须返回一个对象,该对象在内部可以isEmpty
设置一个标志来表示错误。
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
}
否则,您可以使用第三方工具来做同样的事情。请参阅其他人对此案例的回答。