2016-09-30 58 views
0

我有一個由dobule A [2] [2]組成的matrix2d類。我試圖做一個構造函數,它使用相同類型的obejct並將其所有值複製到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]); 
      } 
     } 
    } 

它告訴我,我嘗試將double賦給matrix2d對象。爲什麼* Z [i] [j]沒有引用double?

求助: 我做了A [i] [j] = Z.A [i] [j] :)!

+0

相同的錯誤:'operator []'不匹配'(操作數類型是'matrix2d'和'int') –

+2

爲什麼'*'?沒有涉及指針。 –

+0

讓編譯器完成它的工作。它會使複製構造函數執行正確的操作。 – juanchopanza

回答

0

你當然可以做for循環技術 - 我認爲這將有助於你理解數組和指針。但是難以擊敗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

@juanchopanza,當然。 –

1

有你的拷貝構造函數的問題,你是陰影成員(會員名Z和參數名稱Z)之一。

我建議不要寫你自己的拷貝構造函數,讓編譯器生成一個對您:

matrix2D(const matrix2D & value) = default; 
1

添加第二個答案。這是我喜歡的答案。

只需從您的類聲明和定義中刪除複製構造函數。

鑑於您的類只包含一對固定大小的數組,您不需要複製構造函數。編譯器會自動爲你生成一個。通常只有當您的類具有動態分配的成員變量時才需要定製拷貝構造函數,並且您需要確保指針值不是跨實例的別名。