ポインタを保持するクラスでの演算子のオーバーロード(C++)

[戻る]
リライ [E-Mail] 2005/08/03(水) 21:42:48
初めまして。リライと申します。
現在学校の課題に取り組んでおりまして、その中で行列を扱う場面が出てきました。
そこで正方行列を扱うMatrixクラスを作ろうと思っているのですが、
2項演算子(+や*や-)のオーバーロードでつまずいてしまいました。

計算結果を一時オブジェクトに入れ、それを値渡しで返そうと思っています。
しかし、Matrixクラスが行列データをdouble **Arrayという2次元配列への
ポインタで持っているため、値渡しだとローカルの1時オブジェクトと、戻り値の
コピーオブジェクトが同じ2次元配列を指してしまいます。
それで、関数が終わって一時オブジェクトのデストラクタが呼び出された時に、
戻り値のコピーオブジェクトの配列まで解放してしまい、使い物になりません。

こういった状況で、この演算子をオーバーロードするにはどうしたらいいでしょうか?

ソースは以下です。
//*演算子のオーバーロード
Matrix Matrix::operator *(const Matrix &matrix_)const{
    //一時オブジェクトの作成
  Matrix temp(this->Size);
  int i,j,k;
  //行列計算
    for(i=0;i<this->Size;i++) {   
        for(j=0;j<this->Size;j++) {
            for(k=0;k<this->Size;k++) {
                temp.Array[i][j]+=this->Array[i][k]    
                  * matrix_.Array[k][j];
            }
        }
    }
  return temp;
}

リライ [E-Mail] 2005/08/03(水) 21:50:12
本当に申し訳ないです。間違えて2回投稿してしまいました。
回答は上のスレッドにお願いしたいです。お目汚し申し訳ありません。

リライ [E-Mail] 2005/08/03(水) 21:54:39
追記です。
開発環境はVC++6.0、OSはWindowsXPです。よろしくお願いします。

YuO [E-Mail] 2005/08/03(水) 22:24:40
コピーコンストラクタを適切に書いていないのが原因では?

コピーコンストラクタでArrayを複製するとか,
カウンタを使って共有するとか,
コピーされることを前提とした処理を書いてみると良いでしょう。

リライ [E-Mail] 2005/08/03(水) 23:30:47
[[解決]]
ご指摘ありがとうございます。
コピーコンストラクタを実装して、
return Matrix(temp);
の様にしたところ、上手くいきました!
私の場合、代入演算子関数(=)なども正しく実装する必要がありましたが…^^;。
しかし、ポインタメンバを持つクラスは、さまざまな部分で注意がいりますね。

今回は本当に助かりました。ありがとうございました!

古いスレッドには追加発言できません。