1

2 つの行列を合計して c++ で合計行列を返す + 演算子を再定義しようとしました。しかし、どういうわけか、常に0が表示されます。私は何が欠けていますか?これが私のコードです。また、私はこのコードを書きました。

#include <iostream>
using namespace std;
class matrix{
    public:
        int a[100][100], n;
        matrix(int b[100][100], int n){
            for(int i=0; i<n; i++){
                for(int l=0; l<n; l++){
                    a[i][l]=b[i][l];
                }
            }
            n=n;
        }
        matrix(){}
        void matrix_input(int n){
            for(int i=0; i<n; i++){
                for(int l=0; l<n; l++){
                    cin >> a[i][l];
                }
            }
        }
        void matrix_print(int n){
            for(int i=0; i<n; i++){
                for(int l=0; l<n; l++){
                    cout << a[i][l] << " ";
                }
                cout << endl;
            }
        }


} ;
matrix operator + (matrix x, matrix y){
            int s;
            int n=x.n;
            matrix sum;
            for(int i=0; i<n; i++){
                for(int l=0; l<n; l++){
                    sum.a[i][l]=y.a[i][l]+x.a[i][l];

                }
            }
            return sum; 
}

int main(){
    int n;
    cin >> n;
    matrix o;
    o.matrix_input(n);
    matrix c;
    c.matrix_input(n);
    matrix sum;
    sum=o+c;
    sum.matrix_print(n);
    return 0;
}
4

2 に答える 2

2

あなたの主なエラーはn=n、自己割り当てである行にあります。

お察しのとおり、n が整数の場合 (ほとんどの場合はそうなるはずです)、これはほとんどノーオペレーションです。つまりthis->n = n、;

(より良い方法は、命名を衝突させないことですが、その小さな修正は機能します。また、割り当てに operator+ を修正する必要がありますsum.n = n;

ローカルnパラメーターはクラス メンバーよりも優先されるため、クラス メンバーthis->nを修飾する必要があります。

ちなみに、行列は非常に大きい (10,000 int) ため、コピーにはコストがかかります。したがって、operator+パラメーターを const 参照として使用すると、オーバーロードはより効率的になります。

物理的に行列は常に 100 * 100 であるため、おそらくn論理サイズです。ただし、デフォルトのコンストラクタは少なくともn0 に初期化する必要があります。そうしないと、この行列を読み取ろうとする後続の動作が未定義になります。マトリックスの境界を超えている可能性があるものを読み取るときは、アサーション チェックを入れる必要があります。(オペレーター+は、両方が同じ次元であることを確認できます)。

「動的な」サイジングを使用して、実際にマトリックスに使用するメモリ リソースのみを使用する場合は、実装方法が少し異なります。それはあなたのレベルのより高度な演習になると思います。

ちなみに、「常に0を出力する」ことはランダムです。これは、取得する必要がある動作が実際には未定義であるためx.nですsum.n

于 2013-04-11T12:06:58.320 に答える
2

マトリックス コンストラクターでn = n、パラメーターをそれ自体に割り当てます。あなたはおそらく意味しthis->n = n;た。ただし、 member-initializer リストを使用する方がよいでしょう:

matrix(int b[100][100], int n) : n(n)
{
  for(int i=0; i<n; i++) {
    for(int l=0; l<n; l++) {
        a[i][l]=b[i][l];
    }
  }
}

そして、あなたoperator +は設定しませんsum.n

アップデート

matrix_input()nマトリックスのメンバーも変更しません。つまり、クラスは独自の不変条件を維持しません。x.n内部でクエリを実行してoperator +も意味がありません。

matrixそのメンバーnが常に有効で、マトリックスの内容を反映するように変更する必要があります。その後、パラメータnを から削除できますmatrix_print()

ところで、なぜメンバー関数を呼び出すのmatrix_somethingですか? それらはすでに の範囲内にありmatrixます。ちょうどいいinputでしょprintう。

于 2013-04-11T12:07:45.657 に答える