2016-05-31 3 views
0

汎用2D配列用に独自のクラスを作成したいとします。これは私がこれまで持っているものです。[] []演算子を使用して汎用2D配列クラスの値を変更します

#pragma once 
#include <vector> 

using namespace std; 

template<class T> 
class My2DArray { 
private: 
    vector<vector<T>> array; 
    int width, height; 

public: 
    My2DArray() {} 
    My2DArray(int w, int h) : width(w), height(h) { 
     array.resize(w); 
     for (int i = 0; i < w; i++) { 
      array[i].resize(h); 
     } 
    } 

    ~My2DArray() {} 

    vector<T> operator[](int index) { 
     return array[index]; 
    } 

    T* at(int x, int y) { 
     return &array[x][y]; 
    } 

    int getWidth() { return width; } 
    int getHeight() { return height; } 
}; 

私は再び、ベクトルクラスのデフォルト[]オペレータによってアクセスすることができvector<T>を返す私のクラスのための私自身の[]オペレータが、私は私のことを期待していますのでクラスは法線ベクトルのように機能しますが、そうは思われません。自分のクラスの[][]オペレーターの仕事を作るための方法はあり

My2DArray<int> intArray1(5, 5); 
intArray1[0][0] = 2;    //does not work 
cout << intArray1[0][0] << "\n"; //prints 0 
/*-------------------------------------------*/ 
My2DArray<int> intArray2(5, 5); 
*intArray2.at(0,0) = 2;   //works 
cout << intArray2[0][0] << "\n"; //prints 2 
/*-------------------------------------------*/ 
vector<vector<int>> intArray3; 
intArray3.resize(5); 
for (int i = 0; i < 5; i++) { 
    intArray3[i].resize(5); 
} 
intArray3[0][0] = 2;    //works 
cout << intArray3[0][0] << "\n"; //prints 2 

または私は私を与える私の.at(x,y)機能を使用する必要があります。以下は私がまたは2D配列の要素を変更することはできませんどのように次の3つの方法を示していポインタとそれを使用して値を変更する?

+2

'const My2DArray'が' [] 'を使用できるようにする' operator [] 'の2番目のオーバーロードがありません。また、この場合は 'width'や' height'のような無関係な変数を使うべきではありません。あなたは 'vector'を使い、' vector'は 'size()'メソッドを呼び出すことによって次元を知ります。これらの無関係な変数を使用することで、(変数の幅と高さを更新しないために)バグが発生する可能性が高まります。したがって、あなたのコンストラクタは単純に次のようになります: 'My2DArray(int w、int h):配列(w、std :: vector (h)){}' – PaulMcKenzie

答えて

3

あなたのoperator[]は、非常に非効率でマトリックスを変更することを許可していない、あなたのマトリックスカラムの新しいコピーを返します。あなたが本当の行列要素にアクセスする場合は、参照するメソッドの戻り値の型を変更します。

vector<T> &operator[](size_t index) { 
    return array[index]; 
} 

size_tは、おそらく負のインデックスを使用しないためのインデックスのタイプとして、より理にかなっています。)

My2DArray(size_t w, size_t h) : width(w), height(h), array(w, vector<T>(h)) {} 

なく、最初のデフォルトに構築し、次いでさらにCTOR本体に変更された:

はBTW、アレイ自体は、より良好な適切なサイズに初期化されます。

関連する問題