2016-09-21 22 views
0

printMatrixクラス関数のコンストラクタで作成した2次元配列にアクセスできません。私がシンプルなcoutを使ってメインで関数を呼び出すと、< < "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:追加A 'size()'アクセサメンバー関数、

4:使用初期化子リストは "matrixSize" パラメータをコピーするために "matrixSize_" メンバー、

5:削除 'int型**' と私たちは '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