2011-08-14 6 views
0

「この」キーワードに関する質問があります。私は二変量多項式を表す "BiPoly"というクラスを持っています。 BiPoly<NT>::DifferentiateX()というメンバ関数があり、これは部分微分wrt Xを取得し、自己修正します。 BiPolyと呼ばれる別のメンバ関数でC++で "this"を使用して、メンバ関数でローカルオブジェクトを作成することはできますか?

template <class NT> 
BiPoly<NT> & BiPoly<NT>::differentiateX() { 
    if (ydeg >= 0) 
     for (int i=0; i<=ydeg; i++) 
    coeffX[i].differentiate(); 

    return *this; 
}//partial differentiation wrt X 

:: EVAL1は()、私はBiPoly<NT>::eval1()を呼び出して、オブジェクトのDifferentiateX()の結果を取得する必要があります。 DifferentiateX()は自己修正されているので、eval1()内で結果を得るために一時変数を作成する必要があります。私の質問は:"this"を使用してメンバー関数内で一時オブジェクトを作成できますか?もしそうなら、どうしたらいいですか?

答えて

4

あなたはその後、差別と評価あなたの多項式オブジェクトのコピーを得、*thisにコピーコンストラクタを使用することができます。

BiPoly<NT> copy(*this); 
copy.DifferentiateX(); 
NT val = copy.eval1(arg); 

あなたは(標準vector中など)の係数を格納しない方法によっては、かもしれません実際にコピーコンストラクタを書く必要はありません。

0

関数内で作成された一時オブジェクトへの参照を返さないでください。関数の終了時に破棄されます。

あなたは、むしろこのようあなたの関数を宣言したい:

template <class NT> 
BiPoly<NT> BiPoly<NT>::differentiateX() { 
    BiPoly nv = *this;  
    if (nv.ydeg >= 0) 
     for (int i=0; i<=nv.ydeg; i++) 
    nv.coeffX[i].differentiate(); 

    return nv; 
}//partial differentiation wrt X 

注意をそれはオブジェクトではなく、それへの参照(NVのコピー)を返します。

+0

彼の 'differentiateX'関数の定義は全く問題ありません。これは、一時オブジェクトへの参照を返すわけではありませんが、 '* this' - メソッドが呼び出されたオブジェクトです。もちろん、 'BiPoly return 'のようなものを実行するために使うことができますが、メソッド自体を呼び出すのではなく、そのようなメソッドを呼び出すコードでは問題になります。 – Xion

+0

Xionに:ええ、ちょうど彼の質問が「私はこれを使ってメンバー関数内の一時オブジェクトを作成できますか」ということに気付きました。それで、答えは何とかしても有効です: 'BiPoly nv = * this;'は、このオブジェクトを使った初期化でこのような一時変数を宣言する方法です。 –

関連する問題