2012-03-26 9 views
0

私の宿題では、クラスに保持されている複素数を操作するためにバイナリ演算子を使用する必要があります。ベクトル内に保持されたオブジェクトをオペレータに渡すにはどうすればよいですか?

ファイルからループを読み込む際に各クラスが作成される(新しいものを使用)ので、それらを参照できるように、プッシュバックを使用してベクトル内に格納しました。

現在の関数定義:クラス内

Complex Complex::operator+ (vector<Complex> &v) 
{ 
result= new Complex; 

result.real=real+v[y].real; 
result.imaginary=imaginary+v[y].imaginary; 

return result; 
} 

現在の定義:メイン関数で呼び出さ

Complex operator+ (vector<Complex> &v); 

: 結果= V [X] + V [Y]。

私が見つけたものはすべて、既知の名前を持つクラスに依存しているので、ポインタを送信できます。私は実行時に使用するクラスを選択できるようにしたいので、セットのベクトルメンバーを与えることはできません。

私はこれがすべて間違っていることを認識していますが、これを行うには最良の方法が何であるかについては迷っています。

助けがあれば助かります。 :) Hxの

+4

ここでは、「new」を使用することは絶対にありません。 –

+1

複合体と別の複合体、または複合体を複合体のベクトルで追加しようとしていますか?あなたの主な関数呼び出しは前者を、後者はオペレータパラメータを、それぞれ示します。 – juanchopanza

答えて

0
result.real=real+v[y].real; 

どこからyを得るのですか?

Complexの追加を定義する場合は、std::vector<Complex>とします。これは少し奇妙です。通常は、Complex + Complexのオーバーロードを定義し、そのタイプの変数に対して(は明らかにまたは数学的に定義され、曖昧さがない場合にのみ構文上の便宜として)を使用することをお勧めします(たとえば、ベクター)。現在定義している動作は、演算子のオーバーロードではなく、単なる関数であるべきです。

newの使用は不要で、対応するdeleteが存在しないためメモリリークの原因となり、ヒープ内のメモリアドレスが解放されません。通常のスタック変数として初期化する必要があります。

Complex result; 

可能な限り、スタック割り当てを優先します。メモリの問題を避けるだけでなく、高速です。

どちらの方法でも、この変数は2つのコピーを持つ一時的なものです。 1つは戻り、もう1つはpush_backのベクトルの内側にあります。

あなたの質問で言えば、異なる数値型で動作し、演算子のオーバーロードを使用する集約クラスがいくつかあると思います。

テンプレートを使用して、集計クラスをテンプレートクラスとして定義し、それを数値型でインスタンス化することができます。Complexその後、クラスのいくつかの機能であなたは、テンプレート変数に+過負荷を利用することができ、(ちょうど彼らが定義されoperator+()を持っていることを確認してください):

template <typename T> 
class MyNumericAggregatorClass 
//... in some function 
// T a; T b; 
T result = a + b; 
//... 

これに代わるものを作成するために、多型を使用することですvirtual operator+()の基本数値クラス、およびこの演算子をオーバーライドするサブクラス(例:Complex)を使用すると、基本クラスポインタのコレクションを操作できます。

さらなるガイダンスを提供するために、より多くのコードを表示する必要があります。しかし、あなたがしようとしているのは、演算子+を使用してベクトルに格納された数値型の合計インスタンスである場合は、STLからstd::accumulateをチェックアウトし、問題は解決されます。

関連する問題