我有一个方法,我想迭代地在两个数据成员之一上运行,在它们之间交替。我想做下面的事情
void myClass::alternating_method(){
Graph G;
&G = iteration_number%2 ? &A : &B;
helper_method_which_modifies(G);
iteration_number++;
return;
}
其中A
和B
以及iteration_number
都是myClass
成员,但我不确定它是否可行。这似乎对我来说,但风格让我错了。所需的结果是在循环中调用object.alternating_method()
并让其修改object.A
和object.B
。
这会有用吗?有没有更好的办法?会有意想不到的后果吗?我是否需要担心在G
超出范围时调用析构函数?
编辑:为了澄清,我的意思是helper_method_which_modifies
作为包含多种方法的100行的简写。修改G
的主要是升压图方法。现在我看到了答案,看来最好是让alternator
除了在A
和B
之间做出选择之外什么也不做,然后将正确的变量传递给另一个方法。 / p>
答案 0 :(得分:4)
正如Luchian Grigore所说,它不会起作用,因为你需要一个L值。
这个想法很有效,虽然变化不大。
void myClass::alternating_method(){
Graph& G = iteration_number%2 ? A : B;
helper_method_which_modifies(G);
iteration_number++;
return;
}
或者进行更多更改:
void myClass::alternating_method(){
helper_method_which_modifies((++iteration_number%2) ? A : B);
}
答案 1 :(得分:1)
将G
作为参考:
void myClass::alternating_method(){
Graph& G = iteration_number%2 ? A : B;
helper_method_which_modifies(G);
iteration_number++;
return;
}
另一种选择是完全消除G:
void myClass::alternating_method(){
helper_method_which_modifies(iteration_number%2 ? A : B);
iteration_number++;
return;
}
答案 2 :(得分:1)
你是正确的,因为&
运算符是地址运算符。但是,您无法分配到某个地址(搜索“rvalue vs. lvalue”或类似内容)。
您可以做什么将G
声明为指针,并使该指针指向A
或B
:
Graph* G = iteration_number%2 ? &A : &B;
另一个解决方案是,因为您使用的是C ++,所以要使G
成为引用:
Graph& G = iteration_number%2 ? A : B;
答案 3 :(得分:1)
为什么不在不使用G
的情况下调用它?通过这种方式,您无需担心它。
void myClass::alternating_method(){
helper_method_which_modifies((iteration_number%2 ? &A : &B));
iteration_number++;
return;
}
答案 4 :(得分:1)
对占位符G没有实际需要。
void myClass::alternating_method(){
if(iteration_number%2 == 1) {
helper_method_which_modifies(A);
} else {
helper_method_which_modifies(B);
}
iteration_number++;
}