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