2012-05-07 10 views
2

C++では、コンパイルエラーを理解するのに苦労します。 (例えば)C++ ref byコンパイルエラー

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

私の質問の懸念引数double& functry: 私はこの与えられた署名で、この機能を持っています。この関数を別の関数でtryNMSA()と呼びます。この関数の実行中にfunctryを変更したいと思います。それが私が参考にして渡す理由です。私が参照してものを渡したいんので、私はこのampersheadを入れ

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

:ここ

が関数呼び出しです。それは許されない。何が間違っているのですか?

ありがとうございます。

+0

あなたがメモリアドレス(すなわちポインタ)を関数に送るアンパサンドを置くならば。 – Lucian

答えて

4

funcTryへの参照ではなく、ポインタを与えるので、アンパサンドをそこに置くべきではありません。変数への参照を取得するのに、特別なシンボルや演算子は必要ありません。変数の名前を使用するだけです。

2

関数を呼び出すときに&を削除するだけです。&を追加すると、ポインタを渡そうとしていることを意味します。

&を置かない場合は、参照を渡します。特別な構文は必要ありません。

2

&funcTryを渡すと、doubleへのポインタを期待する関数と一致するfuncTryのアドレスが渡されます。あなたの呼び出しは、単に宣言の外

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

する必要があり、単一のアンパサンドは、アドレスのことを意味するので、&fooaddress-of fooを意味します。

0

あなたはこのような呼び出しにアンパサンドを省略しなければならない:メソッド宣言でアンパサンドは、参照引数としてそれをマークし

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

。メソッド呼び出しでアンパサンドを実行すると、funcTry変数のアドレスを渡していますが、これは不変で参照渡しできないため、コンパイラにエラーが発生します。

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です。

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つの値に重点を置くと便利です。

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

私は他の回答を繰り返さない。私は、これが学習者の間で繰り返される問題であると言いたいと思います。C++問題は&符号が3つの全く異なる意味を持っていることであり、これは初心者にはすぐに明らかにされていません:x&xがそのアドレスで、その後、L値である

  1. 場合。
  2. <type>の変数を<type> xと宣言すると、<type> &xは、タイプreference to <type>の変数を宣言します。
  3. a & bはビット単位の演算子です。

これは*記号のようになります。

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

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