2016-09-30 1 views
0

나는 dobule A [2] [2]로 구성된 matrix2d 클래스를가집니다. 나는 같은 타입의 객체를 취하고 모든 값을 A [2] [2]로 복사하는 생성자를 시도하고있다. I은 문제가 있다면, 여기에 클래스 :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]가 이중을 참조하지 않는 이유는 무엇입니까?

해결 : 나는 [[i] [j] = Z.A [i] [j] :)!

+0

동일한 오류 : '연산자 []'과 일치하지 않음 (피연산자 유형이 '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

@ juanchopanza. –

1

이 복사 생성자에 문제가있다, 당신은 회원 (멤버 이름 Z 및 매개 변수 이름 Z) 중 하나 그림자됩니다 하나를 구현해야하는 경우에는, 그것의 라인을 따라 뭔가 할 필요가있다.

나는 당신의 자신의 복사 생성자를 작성하고 컴파일러가 당신을 위해 하나를 생성 못하게 제안

:

matrix2D(const matrix2D & value) = default; 
1

을 두 번째 대답을 추가. 그리고 이것이 제가 선호하는 대답입니다.

클래스 선언 및 정의에서 복사 생성자를 모두 제거하기 만하면됩니다.

클래스에 고정 크기 배열 쌍만 있으면 복사 생성자가 필요하지 않습니다. 컴파일러가 자동으로 생성합니다. 사용자 정의 복사 생성자는 일반적으로 클래스가 동적으로 멤버 변수를 할당하고 포인터 값이 인스턴스간에 별칭이 지정되지 않도록해야 할 때만 필요합니다.