2016-09-30 54 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

添加第二个答案。这是我喜欢的答案。

只需从您的类声明和定义中删除复制构造函数。

鉴于您的类只包含一对固定大小的数组,您不需要复制构造函数。编译器会自动为你生成一个。通常只有当您的类具有动态分配的成员变量时才需要定制拷贝构造函数,并且您需要确保指针值不是跨实例的别名。