2

使用 C++,我很难理解一个编译错误。我有这个功能,有这个给定的签名:

void MethodNMMS::tryNMSA(double factor, double temperature,double& funcWorst,int& iWorst,      double& funcTry, double* funcEvals)
{
     //...
}

我的问题涉及论点double& functry(例如)。我在另一个函数中调用这个函数tryNMSA(),我希望在执行这个函数期间修改 functry。这就是我通过引用传递的原因。

这是函数调用:

// other initializations for funcEvals...
double funcTry = 0;
tryNMSA(-1.0,temperature,funcWorst,iWorst,&funcTry,funcEvals);

我放了这个符号是因为我确实想通过引用传递这个东西。这是不允许的。怎么了,为什么?

谢谢并恭祝安康。

4

8 回答 8

4

您不应该在此处放置与号,因为这样做会给出一个指针,而不是对 . 的引用funcTry。获取对变量的引用不需要任何特殊符号或运算符 - 只需使用变量的名称即可。

于 2012-05-07T12:49:27.953 回答
2

只需在调用函数时删除&- 添加&您尝试传递指针的方法。

如果你不放&,你会通过一个参考。不需要特殊的语法。

于 2012-05-07T12:50:02.300 回答
2

通过传递&funcTry,您传递的是 的地址funcTry,该地址将匹配一个期望指向 的函数double。你的电话应该只是

ryNMSA(-1.0,temperature,funcWorst,iWorst,funcTry,funcEvals);
于 2012-05-07T12:50:26.493 回答
0

在声明之外,一个 & 符号表示地址,所以&foo表示address-of foo.

于 2012-05-07T12:50:37.937 回答
0

您应该像这样在调用中省略与号:

tryNMSA(-1.0,temperature,funcWorst,iWorst,funcTry,funcEvals);

方法声明中的 & 符号将其标记为引用参数。当您在方法调用中执行 & 时,您传递的是 funcTry 变量的地址,该变量是不可变的并且不能通过引用传递,因此编译器会给您一个错误。

于 2012-05-07T12:51:11.900 回答
0

删除参数前面的&。

这里的信息:http: //pages.cs.wisc.edu/~hasti/cs368/CppTutorial/NOTES/PARAMS.html

参考参数

当一个参数通过引用传递时,从概念上讲,传递的是实际参数本身(并且只是给了一个新名称——相应形式参数的名称)。因此,对形式参数所做的任何更改都会影响实际参数。例如:

void f(int &n) {
    n++;
}

int main() {
    int x = 2;
    f(x);
    cout << x;  
}

在这个例子中,f 的参数是通过引用传递的。因此,在 f 中对 n 的赋值实际上是在改变变量 x,所以这个程序的输出是 3。

于 2012-05-07T12:53:16.897 回答
0

您可以通过 2 种方式修改参数。

方法一:(参考):

void MethodNMMS::tryNMSA(double& funcTry)
{
    funcTry = funcTry + 1.0;
    //...
}
// other initializations for funcEvals...
double funcTry = 0;
tryNMSA(funcTry);

方法2:(指针):

void MethodNMMS::tryNMSA(double* funcTry)
{
    (*funcTry) = (*funcTry) + 1.0;
    //...
}
// other initializations for funcEvals...
double funcTry = 0;
tryNMSA(&funcTry);

下定决心,只使用其中一个,这样可以避免很多混乱。

(实际上,这里你可以使用另外一种方法——返回值)。强调这一价值是功能的主要目的是有用的。

double MethodNMMS::tryNMSA(double funcTry)
{
    //...
    return funcTry + 1.0;
}
// other initializations for funcEvals...
double funcTry = 0;
funcTry = tryNMSA(funcTry);
于 2012-05-07T12:57:45.790 回答
0

我不会重复其他答案。我只是想说这是C++. 问题是这个&标志有三个完全不同的含义,这对初学者来说并不是很明显:

  1. 如果x是一个左值,那么&x就是它的地址。
  2. 如果<type> x声明一个类型的变量<type>,那么<type> &x声明一个类型的变量reference to <type>
  3. a & b是位与运算符。

这类似于*标志:

  1. 如果x是一个指针,那么*x就是它的内容。
  2. 如果<type> x声明一个类型的变量<type>,那么<type> *x声明一个类型的变量pointer to <type>
  3. a * b是乘法运算符。

出于某种原因,*运营商似乎比&运营商造成的问题更少。也许这只是历史偶然:引用比指针更新。

于 2012-05-07T13:02:47.293 回答