2016-09-21 5 views
0

printMatrix 클래스 함수의 생성자에서 만든 2D 배열에 액세스 할 수 없습니다. 내가 간단한 cout으로 main에서 함수를 호출 할 때 < < "test"; 그것을 인쇄합니다. matrixArray [] []의 값을 인쇄하려고하면 아무 것도 인쇄되지 않고 프로그램이 종료됩니다. 2d 배열을 올바르게 참조하지 않습니까?C++의 클래스 함수에서 2 차원 배열 참조

class matrix 
{ 
    int **matrixArray; 

public: 
    int matrixSize = 0; 
    matrix(int matrixSize); 
    void printMatrix(); 
    void makeMagicSquare(); 
}; 
matrix::matrix(int const matrixSize) 
{ 
    this->matrixSize = matrixSize ; 


    int** matrixArray = new int*[matrixSize]; 
     for(int i = 0; i<matrixSize; i++){ 
      matrixArray[i] = new int[matrixSize]; 
     } 


    for(int row = 0; row < matrixSize ;row++) 
      { 
       for(int col = 0; col < matrixSize; col++) 
       { 
        matrixArray[row][col] =0; 
        cout << matrixArray[row][col] << " "; 
       }//End for Col 
       cout << endl; 
      }//End for Row 

} 
//printMatrix Function 
void matrix::printMatrix(){ 

for(int row = 0; row < matrixSize;row++) 
     { 
      for(int col = 0; col < matrixSize; col++) 
      { 
       cout << "test" << " "; 
       //Not able to print from print function 
       cout << matrixArray[row][col] << endl; 
      }// end col 
      cout << endl; 
     }//end row 

} 
+0

실제로 행렬을 1 차원 벡터에 저장해야합니다. – NathanOliver

+0

대신에 '벡터 >'을 사용하면 누군가가 당신을 때릴 것입니까? –

+0

@ Jean-FrançoisFabre 캐시 지역에 대해 많은 관심을 가진 사람 만. 1D 벡터가 더 좋습니다. 바로 그것에 대해 – vsoftco

답변

4

어떻게 할 수 있습니까?

int** matrixArray = new int*[matrixSize]; 

따라서 matrixArray 생성자 내부에서만 볼 생성자 내부 로컬 변수이다.

대신 데이터 멤버를 사용하면 잘 될 것입니다, 당신은 이미 정의 된 이후 회원, 당신은이 작업을 수행해야 :

matrixArray = new int*[matrixSize]; 

는 소멸자에서 메모리를 삭제하는 것을 잊지 마세요! ;)

+1

사실 OP는 단지'int **'를 제거해야합니다. 잘 잡으세요! – vsoftco

+0

고마워요 @vsoftco, 내 대답은 모두에게 슈퍼 명확하게 그것을 업데이 트했습니다! ;) – gsamaras

+0

그리고 포인터 값을 복사하지 않고 메모리 누수없이 데이터를 복제하는 복사 생성자와 할당 연산자를 만드는 것을 잊지 마십시오. 행운을 빈다, 그것은 쉽지 않다. –

1

매우 일반적인 실수를 범했습니다. 로컬 범위 변수/매개 변수와 멤버 변수를 구별하지 못했습니다.

int** matrixArray = new int*[matrixSize]; 

이 표현은 형태로 시작하기 때문에

, 그것은 반원 (당신이 그것을 액세스 할 수 this->matrixArray를 사용 할 것 "숨어"인 새로운, 지역 변수의 선언이며, 그것은 것 초기화되지 않음). 귀하의 컴파일러 당신에게 "그림자 변수"경고를 제공해야합니다.

일반적인 방법은 멤버 변수를 구별 자의 제공하는 것입니다 : 어떤 사람들은 "M_"로 접두사, 일부는, 그래서 당신의 코드가 될 것 뒤에 "_"를 넣어 :

class matrix 
{ 
    int **matrixArray_ = nullptr; //1 
    int matrixSize_ = 0; //2 

public: 
    matrix(int matrixSize); 
    ~matrix(); //7 
    void printMatrix() const; 
    void makeMagicSquare(); 
    int size() const { return matrixSize_; } //3 
}; 

matrix::matrix(int const matrixSize) 
    : matrixSize_(matrixSize) //4 
{ 
    matrixArray_ = new int*[matrixSize_]; //5 
    for(int i = 0; i<matrixSize_; i++) { 
     matrixArray_[i] = new int[matrixSize_](); //6 
    } 
} 

matrix::~matrix() //7 
{ 
    if (!_matrixArray) 
     return; 
    for (int i = 0; i < matrixSize_; ++i) { 
     delete [] matrixArray_[i]; 
    } 
    delete [] matrixArray_; 
} 

void matrix::printMatrix() const 
{ 
    for(int row = 0; row < matrixSize_; row++) { 
     for(int col = 0; col < matrixSize_; col++) { 
      cout << "test" << " "; 
      cout << matrixArray_[row][col] << endl; 
     }// end col 
     cout << endl; 
    }//end row 
} 

1 : 추가 된 '_ '접미사뿐만 아니라

2, 우리가 실수로 여기에 쓰레기하지 않도록 할 수 있습니다 추가'가 외부에서 불통되지 않도록 _ '접미사 내가 비공개,

3 : 추가 된 'size()'접근 자 멤버 함수,

4 : 이니셜 라이저 목록 "matrixSize"매개 변수를 복사에 "matrixSize_"회원

5 : 제거 '내부 **'우리는 'matrixArray_'사용하고주의 - 회원

(6) : new int[matrixSize_] 뒤에있는 ()은 컴파일러에게 기본으로 을 지정합니다 (0으로 설정). 현대 C++에서는이 코드가 {}이되지만, 최신 C++ 컴파일러를 사용하고 있는지 잘 모르겠습니다. 작업.

7 : 비슷한 이유로

를 사용하는 메모리를 해제하기위한 소멸자를 추가, 당신의 유형 이름 구별하게 고려하는 것이 좋습니다 것입니다 : class Matrix 또는 class matrix_t을.

+0

포인트 바이 비평에 감사드립니다. 나는 모범 사례를 배우려고 노력하고 있는데, 이것이 정말로 도움이되었습니다. – PixelPusher

+0

@TimBotelho 도움이 되서 기쁩니다! 배열과 동적 인 메모리 할당에 대해 어느 정도 이해하는 것이 중요합니다. 그러나 현대 C++은 이러한 것들이 야기하는 고통의 많은 부분을 저장합니다. [vector] (http://en.cppreference.com/w/cpp/container/vector), [unique_ptr] (http://en.cppreference.com/w/cpp/memory/unique_ptr) 및 [shared_ptr] (http://en.cppreference.com/w/cpp/memory/shared_ptr) 나중에 읽으십시오 -하지만 너무 늦지는 마십시오 - 많은 고통을 덜어줍니다 :) – kfsone