0

トピックで述べたように、オーバーロードされた演算子からメイン関数に値を渡す際に問題が発生しました。私はこれをたくさん検索しましたが、効果はありませんでした。これが私のサンプル演算子です。Matrix mi を返す前の行は、アルゴリズムが正常に機能するかどうかを確認するために c を配置しました。乗算演算子にも同じ問題があります。

マトリックス.h

class Matrix 
{
public:
...
Matrix &operator+(const Matrix &m)
... 

private:
    int x;
    int y;
    double **tab;

};

マトリックス.cpp

Matrix &Matrix::operator+(const Matrix &m)
{
if(x==m.x && y==m.y)
{
    Matrix temp(x,y);
    for(int i=0;i<x;i++)
    {
        for(int j=0;j<y;j++)
        {
            temp.tab[i][j]=tab[i][j]+m.tab[i][j];
        }
    }
    cout << temp<< endl;
return temp;
}
else
{
    char er[]={"error!\n"};
    throw er;
}

}

4

2 に答える 2

2

基本的な問題は、加算演算子が参照ではなく値を返す必要があることです。

Matrix operator+(const Matrix &m);

これは、乗算、減算などに適用されます。

関数のスコープにのみ存在する変数への参照を返すという事実に加えて、参照を返すことは意味的に意味がありません。次の表現を考えてみてください。

B + C;

参照を返す場合、何を参照する必要がありますか?

一般的なアプローチはMatrix& operator+=(const Matrix&)、メンバー演算子として実装してから、非メンバーとして追加を実装することです。

Matrix operator+(Matrix lhs, const Matrix& rhs)
{
  return lhs += rhs;
}

これにより、操作が左右対称の WRT になり、両側で暗黙的な変換が可能になります。

于 2013-04-03T08:40:21.763 に答える
0

簡単な答え: 関数で作成したオブジェクトへの参照を決して返さないでください。つまり、演算子は aMatrixではなく aを返す必要がありますMatrix&(&は戻り値の型に属します。より明確にするためにそこに配置することをお勧めします)。

Matrix クラスに適切な移動コンストラクターを提供すると、結果を返す際にコストのかかるコピーは発生しません。

于 2013-04-03T08:42:25.817 に答える