C++通过引用编译错误传递



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

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

我的问题涉及论点double& functry(例如)。我在另一个函数中tryNMSA()调用此函数,并且我希望在执行此函数期间修改函数。这就是为什么我通过参考。

下面是函数调用:

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

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

谢谢和问候。

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

只需在调用函数时删除& - 添加&意味着您正在尝试传递指针。

如果不输入&,则将传递引用。无需特殊语法。

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

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

在声明之外,单个 & 符号表示地址,因此 &foo 表示 address-of foo

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

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

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

删除参数前面的 &。

信息在这里: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。

我不会重复其他答案。我只是想说,这是C++学习者反复出现的问题。问题是&符号有三种完全不同的含义,这对初学者来说并不是很明显的:

  1. 如果x是 l 值,则&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是乘法运算符。

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

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

方法1:(参考):

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);

相关内容

最新更新