0

オペレーターのオーバーロードに頭を悩ませています。この場合、私が持っている + 演算子と私が試した例の場合、どんな助けも大歓迎です。

「'class Matrix' の使用が無効です。これを修正する方法がわかりません。これら 2 つの Matrix オブジェクトを一緒に追加するにはどうすればよいですか?」というエラーが表示されます。

Matrix Matrix::operator+(const Matrix& rhs){
return Matrix(Matrix + rhs.Matrix());
}


   Matrix::Matrix(int MM, int NN){
                  M = MM;
                  N = NN;
                  data = new double[M * N];
                  for ( int i =0; i < M; i++)
                  {
                      for (int j = 0; j < N; j++)
                      {
                          data[i* N+j] = (double) 1000 + i*N+j;
                    //      cout << data[i*N+j] <<"\t";
                      }
                      //cout <<"\n";
                  }

       cout << "Matrix Constructor... (code to be implemented here!!!)\n";}

ありがとう

4

3 に答える 3

4
  1. rhs_Matrix
  2. メソッドのようなコンストラクターの呼び出しは非常に違法です
  3. ではMatrix + rhsMatrix識別子ではありません
  4. 識別子を整理したら、*this + rhsは と同等this->operator+(rhs)です。このことから、ここで行ったことは無限再帰を作成したことだけであることは明らかです。
于 2012-04-06T10:55:56.553 に答える
1

jpm's answer is very important to look at. Once you've fixed these things, you can look at mine.

Essentially, an operator overload is no different than any other function.

So, in the case of:

Matrix Matrix::operator+(const Matrix& rhs)

What you're really doing there is saying: add rhs to the current matrix, and return a new matrix. Your overload should not alter the current matrix. Help yourself and use a constant:

Matrix Matrix::operator+(const Matrix& rhs) const

A matrix addition like that should first check if the matrices have the same dimensions so that you can add them together, then loop through all "cells" and add them, and create a matrix out of that. For that, I'm guessing you'll need a second constructor, something like:

Matrix::Matrix(int MM, int NN, double values[])
{
    M = MM;//TODO: change to width
    N = NN;//TODO: change to height
    data = new double[M*N];
    for(int i < 0; i < M; i++)
        for(int j < 0; j < N; j++)
            data[i * N+j] = values[i * N+j];
}
于 2012-04-06T11:07:17.087 に答える
0
return Matrix(Matrix + rhs.Matrix());
              ^^^^^^       ^^^^^^

Matrix式があるはずの型名()を使用しています-それはコンパイラが不平を言っていることです。また、無効な(そして無意味な)既存のオブジェクトでコンストラクターを呼び出そうとしています。operator+また、自分自身を呼び出すような方法で実装しようとしているようです。なんらかの方法でコンパイルすると、無限再帰のためにスタックオーバーフローが発生します。

おそらく、加算を実装する最も簡単な方法はoperator+=、既存の行列に1つの行列を追加するように実装operator+してから、その観点から実装することです。

Matrix & Matrix::operator+=(Matrix const & rhs) {
    // Perform addition here
    for (int i = 0; i < N*M; ++i) {
        data[i] += rhs.data[i];
    }
    return *this;
}

// This can be a non-member function
// Pass "lhs" by value to get a copy, then modify and return that.
Matrix operator+(Matrix lhs, Matrix const & lhs) {
    return lhs += rhs;
}

// Or if you really want a member function for some reason
Matrix Matrix::operator+(Matix const & rhs) const {
    return Matrix(*this) += rhs;
}

これには、正しいコピーコンストラクタが必要です-コンストラクタで自分でメモリを割り当て、おそらくデストラクタでメモリの割り当てを解除するため、新しいメモリを正しく割り当てるためにコピーコンストラクタを実装する必要があります( 3つのルールに従って)、そうしないと、マトリックスをコピーした後に二重削除が発生します。

于 2012-04-06T12:26:21.283 に答える