0
我想爲通用二維數組創建我自己的類。這是我到目前爲止有:用[] []運算符更改通用二維數組類的值
#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)
功能給我一個指針並使用它來修改一個值?
您錯過了'operator []'的第二個重載,它允許'const My2DArray'能夠使用'[]'。另外,在這種情況下,你不應該使用'width'和'height'等外部變量。你正在使用'vector',而'vector'通過調用'size()'方法來知道它的維數。通過使用這些無關變量,您將增加發生錯誤的機會(由於未更新寬度和高度變量)。因此,您的構造函數可以簡單地爲:'My2DArray(int w,int h):array(w,std :: vector(h)){}'沒有任何循環。 –
PaulMcKenzie