2017-09-26 17 views
0

私はC++でテンプレート行列クラスを作成しています。このクラスを作成するために、ポインタの配列を作成しています。これらのポインタは動的配列を指しています。C++テンプレートクラス配列へのポインタの動的配列

これまでのところ私が持っている:

template<typename T> class Matrix 
    { 
    public: 
     //constructor 
     int **m = new int*[_rows]; 
     for (int i = 0; i < _rows; i++) 
     { 
      m[i] = new int[_cols]; 
     } 

     //destructor 
     for (int i = 0; i < _rows; i++) 
     { 
      delete[] m[i] 
     } 
     delete[] m; 
    }; 

私はまた、このような構造を操作するために、いくつかの関数を作成したいと思います。 これとよく似たコードが使われていますが、これがどのように他の配列へのポインタを含む配列を作成するのか分かりません。このコンセプトは私にとっては紛らわしいものです。私は自分がしたいことをどうやってやるべきかを私に明確にしたいと思っています。

クラスを分離して、入力とは関係がないようにします。他のコードでも呼び出され、関数を使用して行列構造を作成します。ポインタの配列を作成することは、私にとっては分かりにくい部分ではなく、それらのポインタが他の配列を指し示すようになり、ポインタの配列は、そこにいくつの入力項目があるかに基づいてサイズが増加します。

+1

あなたの人生を楽にして、ポインタと生のメモリ管理の代わりに 'std :: vector'を使いましょう。 – PaulMcKenzie

+0

ありがとうございます。概念的には、私は動的に割り当てられた配列を使用して可能なことをしようとしていますか? – AustinGlad

+0

もちろん可能です。ベクターは内部でどのように機能しますか?それはあなたがやろうとしているものと何も変わりはなく、もっと安全です。次に、Matrixクラスを開発するか、動的配列管理を行うことを目標としていますか? Matrixクラスを開発する場合、 'vector'を使うと、Matrixクラスを実際に開発することができます。 – PaulMcKenzie

答えて

0
#include <iostream> 

using namespace std; 

template<typename T> class Matrix 
{ 
public: 
    Matrix(int row, int col) 
    { 
     _rows = row; 
     _cols = col; 
     m = new T*[_rows]; 
     for (int i = 0; i < _rows; i++) 
     { 
      m[i] = new T[_cols]; 
      for(int j=0; j < _cols; j++) 
      { 
       m[i][j] = i*10 + j; 
      } 
     } 
    } 

    ~Matrix() 
    { 
     for (int i = 0; i < _rows; i++) 
     { 
      delete[] m[i]; 
     } 
     delete[] m; 
    } 

    T **m; 
    int _rows; 
    int _cols; 
}; 

void main() 
{ 
    Matrix<int> a(3,4); 

    for(int i=0; i<a._rows; i++) 
    { 
     for(int j=0; j<a._cols; j++) 
     { 
      cout << "[" << i << "][" << j << "]" << a.m[i][j] << " "; 
     } 
     cout << endl; 
    } 

} 

RESULT:

[0] [0] [0] [1] [0] [2] [0] [3] 3

[1] [0 10] [1] [1] 11 [1] [2] 12 [1] [3] 13

[2] [0] 20 [2] [1] 21 [2] [2] 22 [2 ] [3] 23