2

C++ では、1 つのコンパイル エラーを理解するのに苦労します。私はこの与えられた署名で、この関数を持っています:

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

このアンペアヘッドを付けたのは、参照によって物を渡したいからです。そして、それは許可されていません。何が悪いの?

ありがとうございます。

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

パラメータは2つの方法で変更できます。

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

決心して、そのうちの1つだけを使用すると、混乱を大幅に減らすことができます。

(実際には、ここでもう1つのメソッド(戻り値)を使用できます)。関数の主な目的であるこの1つの値を強調すると便利です。

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

パラメータの前の&を削除します。

ここの情報: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

他の回答は繰り返しません。これは の学習者に繰り返し発生する問題だと言いたかっただけですC++。問題は、&記号が 3 つのまったく異なる意味を持ち、これが初心者にはすぐにはわからないことです。

  1. xが左辺値の場合、は&xそのアドレスです。
  2. <type> xタイプ の変数を宣言する<type>場合は、タイプ<type> &xの変数を宣言しますreference to <type>
  3. a & bビットごとの AND 演算子です。

*これは次の記号に似ています。

  1. xがポインタの場合は、*xその内容です。
  2. <type> xタイプ の変数を宣言する<type>場合は、タイプ<type> *xの変数を宣言しますpointer to <type>
  3. a * bは乗算演算子です。

何らかの理由で、*オペレーターはオペレーターよりも問題が少ないよう&です。おそらくこれは単なる歴史的な偶然です。参照はポインタよりも新しいのです。

于 2012-05-07T13:02:47.293 に答える
0

宣言の外では、単一のアンパサンドは address-of を&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 に答える