2011-09-10 17 views
0

行列を表すクラスを作成しましたが、すべて 算術演算子を上書きします。ここで単項マイナスをオーバーロードの例です演算子のオーバーロードとオブジェクトへのポインタ

RegMatrix.h:

const RegMatrix operator -(); 

RegMatrix.cpp

const RegMatrix RegMatrix::operator -() 
{ 
    RegMatrix newMatrix(*this); 
    newMatrix *= -1; 
    return newMatrix; 
} 

私はこのようなスタック上のオブジェクトをインスタンス化する場合さて、これは完璧に動作しますRegMatrix a(3,3,v)( vは値のベクトルですが、重要ではありません)。 私は(main.cppにで)このようnewキーワードを使用する場合:

RegMatrix* a = new RegMatrix(3,3,v); 
RegMatrix* b = -a; //<---ERROR HERE 

を、私はこれがなぜ起こるかwrong type argument to unary minus 任意のアイデアを得ますか?ありがとう!

P.S. 別の質問: '='演算子は自動的にコピーコンストラクタによってオーバーライドされます。

+1

'operator ='はコピーコンストラクタによって_not_が上書きされます。あなたは自分でそれをオーバーライドする必要があります。しかし、 '='演算子_at宣言_を使用すると、コピーコンストラクタが呼び出されます。他の場所では、 'operator ='が呼び出されます。 –

+1

@Etienne de Martel: 'operator ='は** overriden **ではありませんが、** overloaded **です。標準では、特に** overriden **の機能に** virtual **キーワードを使用する必要があります。 –

+0

@Als Wooops。私はいつもこれらの2つの用語を混同します。 –

答えて

3

aのタイプは、RegMatrix *であり、RegMatrixではありません。 aポイントのオブジェクトに演算子を適用する場合は、a*a)を逆参照する必要があります。演算子を適用して(-(*a))、ヒープ上に別のインスタンスを追加する場合は、新しいコピーを作成しますnewとヒープやコピーコンストラクタに:@leftaroundaboutはコメントで指摘したように

RegMatrix* a = new RegMatrix(3,3,v); 
RegMatrix* b = new RegMatrix(-(*a)); 

それでも、これは、経験則として、あなたがしようとC++で作業するための良い方法ではありません可能であればダイナミックアロケーションを避けてください(メモリリークを望まない場合は、速度が遅く、スマートポインタが必要です)。

+2

これは通常、C++でこれを行うのは非常に良い方法ではないことに言及する価値があります。 – leftaroundabout

+0

@leftaroundabout:はい、それについての行を追加します。 –

関連する問題