【发布时间】:2013-06-24 15:41:38
【问题描述】:
我知道在 C++ 中可以覆盖索引操作 [] 并像使用数组一样处理类内部数据。 是否可以覆盖 [][] 并像使用两个维度数组一样工作?
【问题讨论】:
标签: c++
我知道在 C++ 中可以覆盖索引操作 [] 并像使用数组一样处理类内部数据。 是否可以覆盖 [][] 并像使用两个维度数组一样工作?
【问题讨论】:
标签: c++
是的,这是可能的(std::vector 就是此类的一个例子)。
你应该在你的类或结构中重载 operator[]。
如果您使用正整数来索引数据,可能的签名将是:
RETURN_TYPE operator[] (size_type n);
UPD:如果您想要以非负整数作为键的二维数据结构,您可以使用向量向量:
std::vector<std::vector<YOUR_TYPE>> vector_name;
【讨论】:
为了实现它,您需要重载operator[] 以返回一些也具有operator[] 的对象。例如:
class Proxy {
std::vector<int>::iterator it;
//constructor;
int operator[] (size_t pos) {
return *(it + pos);
}
}
class MyMatrix {
std::vector<std::vector<int>> v;
Proxy operator[] (size_t pos) {
return Proxy(v[pos].begin());
}
}
【讨论】:
Proxy:int* operator[]( int i ) { return &v[ i * columns ]; }。同样,如果您的实现,std::vector<int>& 是一个合适的代理。
确实可以;按照惯例,您将重载 [] 返回对行类型对象的引用,并在该行类型对象上重载 [] 以产生对标量的引用。
您还应该考虑重载指针取消引用,以保持[x] 和*(... + x) 的等效性。
【讨论】:
std::vector<int> v(100); *(v + 7) = 5; 是合法代码。
假设您有一个数组arr,只要您想访问arr[x][y],例如它具有(arr[x])[y] 的等价物,因此首先评估arr[x](我们将其命名为a)然后@ 987654326@ 已评估,因此您只需重载 []operator。
【讨论】:
[] 运算符的左侧始终是一个指针。