我想编写一个循环,遍历同一结构的几个实例(在我的例子中命名为edg),由一个从邻居到邻居的某个函数迭代,直到它返回一个表示STOP的元素。我尝试使用NULL返回编码它,但它不起作用。我可以用什么?
以下是一些代码解释它可能比我之前的话更准确: 我的结构:
struct edg{
int i,j,k;
edg(int a, int b, int c){
i = a; j = b; k = c; //I'm adding a constructor to it
}
}
我的迭代功能:
edg neighbour(edg temp){
if(temp satisfies certain criterias){ return edg(new coordinates);}
else{ return NULL;}
}
我的循环:
while(my_edg!=NULL){
my_edg = neighbour(my_edg);
}
我想我可以选择edg的某个值将其定义为拒绝,并在我的循环中替换为:
while(my_edg!=edg_marked_as_rejection)
但还有另一种方法吗?
答案 0 :(得分:2)
请注意您的功能:
edg neighbour(edg temp){
if(temp satisfies certain criterias){ return edg(new coordinates); }
else{ return NULL; }
}
按值返回edg
的实例,因此尝试return NULL;
无效(除非您已定义了一些自定义转换)。通过指针传递/返回时,NULL
是一个可能的值,在这种情况下,这可能意味着将此函数的原型更改为:
edg* neighbour(edg temp) { ... }
然而,基于语义,通过引用传递并返回指示成功的标志会更合理:
bool neighbour(const edg& temp, edg& result) {
if (...) {
result = ...;
return true;
}
return false;
}
或者如果您的条件“if(temp satisfies certain criterias)
”在大多数情况下应该得到满足且这些标准未得到满足是一种例外状态,您可能还会考虑抛出异常(而不是返回NULL
)。
第三个选项可能是实现 NULL对象设计模式,这意味着将构造并返回标记为“invalid”的edg
实例,并且调用者将执行以下操作:
edg n = neighbour(tmp);
if (!n.isValid()) {
...
}