2016-09-30 9 views
0

私はdobule A [2] [2]からなるmatrix2dクラスを持っています。私は、同じ型のオブジェクトを取るコンストラクタを実行しようとしており、すべての値をA [2] [2]にコピーします。私は、問題を抱えてここにクラスです:C++で配列をコピーする - リファレンス

class matrix2D { 
    public: 
    double A[2][2]; 
    double Z[2][2]; 

    //Default Constructor. 
    matrix2D() { 
     A[0][0] = A[1][1] = 1; 
     A[0][1] = A[1][0] = 0; 
    } 

    matrix2D(double x00,double x01, double x10, double x11) { 
     A[0][0] = x00; 
     A[0][1] = x01; 
     A[1][0] = x10; 
     A[1][1] = x11; 
    } 

、今私はmatrix2Dオブジェクトを取るコンストラクタを作成していますし、次にA.

// Copy Constructor. 
    matrix2D(matrix2D& Z) { 
     for(int i = 0; i < 2; ++i) { 
      for(int j = 0; j < 2; ++j) { 
        A[i][j]=*(Z[i][j]); 
      } 
     } 
    } 

にそのすべての値を取るそれは私のこと私に伝えますmatrix2dオブジェクトにdoubleを代入しようとします。 * Z [i] [j]が二重引用符を参照しないのはなぜですか?

解決: 私はA [i] [j] = Z.A [i] [j] :)を行いました!

+0

同じエラー: 'operator []'と一致しません(オペランドタイプは 'matrix2d'と 'int') –

+2

なぜ '*'ですか?関与するポインタはありません。 –

+0

コンパイラに任せてください。それは正しいことを行うコピーコンストラクタを作成します。 – juanchopanza

答えて

0

あなたは確かにfor-loop技術を使うことができます。配列やポインタの理解に役立つと思います。しかし、単純型の配列をコピーするのはmemcpyの効率を上回るのは難しいです。

// Copy Constructor. 
    matrix2D(const matrix2D& other) { 

     memcpy(A, other.A, sizeof(A)); 
     memcpy(Z, other.Z, sizeof(Z)); 

    } 
+0

memcpyなしでそれを行う方法は? –

+0

@GrzegorzBrzęczyszczykiewiczあなたのコードは大丈夫です –

1

この行の*は意味がありません。

データを指定すると、コピーコンストラクタはまったく必要ありません。

// Use const&, not just &. 
// Use a more suitable variable name for the copy 
matrix2D(matrix2D const& copy) { 
    for(int i = 0; i < 2; ++i) { 
     for(int j = 0; j < 2; ++j) { 
       A[i][j]= copy.A[i][j]; // Copy A 
       Z[i][j]= copy.Z[i][j]; // Copy Z. 
     } 
    } 
} 
+1

いいえ、必要なのはコピーコンストラクタを完全に削除することです!もちろん、私はちょうど – juanchopanza

+0

です。 –

1

があなたのコピーコンストラクタに問題があり、あなたがメンバー(メンバー名Zとパラメータ名Z)の1シャドーイングされている:あなたは1を実装しなければならない場合は、それはの線に沿って何かする必要があります。

私は自分自身のコピーコンストラクタを書いて、コンパイラはあなたのための1つを発生させないことをお勧めします:

秒答えを追加
matrix2D(const matrix2D & value) = default; 
1

。そして、これは私が好む答えです。

クラスの宣言と定義からコピーコンストラクタを完全に削除してください。

クラスに固定サイズの配列のペアが含まれる場合、コピーコンストラクタは必要ありません。コンパイラによって自動的に生成されます。カスタムコピーコンストラクタは、通常、クラスが動的にメンバー変数を割り当てた場合にのみ必要で、ポインタ値がインスタンス間でエイリアスされないようにする必要があります。

関連する問題