我想编写一个循环,遍历同一个结构的几个实例(在我的例子中称为edg ),这个循环由某个函数从一个邻居迭代到另一个,直到它返回一个元素,这个元素表示停止。我试着用空返回来编码它,但是它不起作用。我能用什么?
下面是一些代码,可能比我前面的单词更准确地解释了它:我的结构:
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)但是,还有其他方法可以做到吗?
发布于 2013-10-20 15:23:41
请注意,您的功能:
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)。
第三个选项可能是实现空对象设计模式,这意味着标记为“无效”的edg实例将被构造并返回,调用方将执行如下操作:
edg n = neighbour(tmp);
if (!n.isValid()) {
...
}https://stackoverflow.com/questions/19479021
复制相似问题