0

我有一个方法,我想在两个数据成员之一上迭代运行,在它们之间交替。我想过做以下事情

void myClass::alternating_method(){
    Graph G;
    &G = iteration_number%2 ? &A : &B;
    helper_method_which_modifies(G);
    iteration_number++;
    return;
}

where Aand Band iteration_numberare all myClassmembers,但我不确定它会起作用。这对我来说似乎是对的,但这种风格让我错了。期望的结果是object.alternating_method()在一个循环中调用并让它修改object.Aand object.B

这行得通吗?有没有更好的办法?会不会有意想不到的后果?我是否需要担心G超出范围时会调用析构函数?

编辑:为了澄清,我的意思helper_method_which_modifies是包含几种方法的 100 行的简写。修改G的主要是 boost graph 方法。现在我看到了答案,似乎最好的办法是拥有一个除了在和alternator之间进行选择之外什么都不做的事情,然后将正确的变量传递给另一个方法。AB

4

5 回答 5

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);
}
于 2012-10-31T13:27:51.440 回答
1

您是正确的,因为&运算符是地址运算符。但是,您不能分配给地址(例如搜索“右值与左值”或类似内容)。

你可以做什么将它声明G为一个指针并使该指针指向Aor B

Graph* G = iteration_number%2 ? &A : &B;

由于您使用的是 C++,另一种解决方案G参考

Graph& G = iteration_number%2 ? A : B;
于 2012-10-31T13:23:04.153 回答
1

你为什么不直接调用它而不使用G?通过这种方式,您无需担心。

void myClass::alternating_method(){
    helper_method_which_modifies((iteration_number%2 ? &A : &B));
    iteration_number++;
    return;
}
于 2012-10-31T13:24:15.353 回答
1

不需要占位符 G。

void myClass::alternating_method(){
    if(iteration_number%2 == 1) {
        helper_method_which_modifies(A);
    } else {
        helper_method_which_modifies(B);
    }
    iteration_number++;
}
于 2012-10-31T13:24:31.620 回答
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;
}
于 2012-10-31T13:21:53.857 回答