제네릭 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)
기능을 사용해야합니까 : 다음은 내가 또는 2 차원 배열의 요소를 변경할 수 없습니다 수있는 방법 세 가지 방법을 보여줍니다 포인터를 사용하여 값을 수정 하시겠습니까?
'const My2DArray'가'[]'을 사용할 수있게 해주는'operator []'의 두 번째 오버로드가 없습니다. 또한이 경우에는'width'와'height'와 같은 관계없는 변수를 사용하지 않아야합니다. 당신은'vector'를 사용하고,'vector'는'size()'메소드를 호출하여 크기를 알고 있습니다. 이러한 관계없는 변수를 사용하면 버그가 발생할 확률이 증가합니다 (너비 및 높이 변수를 업데이트하지 않음). 따라서 당신의 생성자는 단순히 다음과 같을 수 있습니다 :'My2DArray (int w, int h) : array (w, std :: vector (h)) {}' –
PaulMcKenzie