可能重复:
Operator[][] overload
我创建了一个包含一个数组的类,该数组包含(在一行中)给定2d数组中的所有数字。例如:{{1,2}{3,4}}
类b
对象中的T
字段包含{1,2,3,4}
。我想为这个类重载[] []运算符,所以它会像那样
T* t.....new etc.
int val = (*t)[i][j]; //I get t->b[i*j + j] b is an 1dimension array
class T{
public:
int* b;
int m, n;
T(int** a, int m, int n){
b = new int[m*n];
this->m = m;
this->n = n;
int counter = 0;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
b[counter] = a[i][j];
counter++;
}
}
}
int main()
{
int m = 3, n = 5, c = 0;
int** tab = new int*[m];
for(int i = 0; i < m; i++)
tab[i] = new int[n];
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
tab[i][j] = c;
c++;
cout<<tab[i][j]<<"\t";
}
cout<<"\n";
}
T* t = new T(tab,3,5);
};
答案 0 :(得分:4)
你做不到。您必须重载operator[]
才能返回代理对象,而该对象会重载operator[]
以返回最终值。
类似的东西:
class TRow
{
public:
TRow(T &t, int r)
:m_t(t), m_r(r)
{}
int operator[](int c)
{
return m_t.tab[m_t.n*m_r + c];
}
private:
T &m_t;
int m_r;
};
class T
{
friend class TRow;
/*...*/
public:
TRow operator[](int r)
{
return TRow(*this, r);
}
};
而不是在T&
中保存TRow
,您可以直接保存指向该行的指针,这取决于您。
此解决方案的一个很好的功能是您可以将TRow用于其他内容,例如operator int*()
。
答案 1 :(得分:1)
对于2d数组,您不需要创建代理类型。只需使用int*
:
#include <iostream>
class T {
public:
int m, n;
int *b;
T(int m, int n) : m(m), n(n), b(new int[m*n]) {
}
int*operator[](std::size_t i) {
return &b[i*m];
}
};
int main () {
T t(2,2);
t[0][0] = 1;
t[0][1] = 2;
t[1][0] = 3;
t[1][1] = 4;
std::cout << t.b[0] << t.b[1] << t.b[2] << t.b[3] << "\n";
}