这可能是一个非常明显的问题,请原谅。

我的项目中有以下代码片段,

#include <stdio.h>
class X
{
  public:
   int i;
   X() : i(0) {};
};

int main(int argc,char *arv[])
{
  X *ptr = new X[10];
  unsigned index = 5;
  cout<<ptr[index].i<<endl;
  return 0;
}

问题
我可以更改ptr[index]的含义吗?因为我需要返回ptr[a[index]]的值,其中a是用于子索引的数组。我不想修改现有的源代码。需要添加任何可以更改行为的新功能。

由于在我的代码中访问索引运算符的位置过多(精确到536),并且在索引下标运算符内部具有复杂的公式,因此我不打算在许多位置更改代码。

PS:
1.我尝试了运算符重载,并得出结论认为这是不可能的。
2. p [i]也将转换为*(p + i)。我无法重新定义基本运算符“+”。

因此,只想再次确认我的理解以及是否有任何捷径可实现。
另外,我需要通过更改每一行代码的皇家方法来解决它:)。

最佳答案

正如亚历克斯所说,对于任何阅读您的代码的人,您对[]的“子索引编制”使用都是完全不明显的。

也就是说,您可以定义这样的类:

template<class T>
class SubindexingList {
    vector<T> data;
    vector<int> subindexes;
public:
    SubindexingList(int count) : data(count) { }
    void set_subindexes(vector<T> const& newval) { subindexes = newval; }
    T& operator[](int index) { return data[subindexes[index]]; }
    T const& operator[](int index) const { return data[subindexes[index]]; }
};

并将X *ptr = new X[10];替换为SubindexingList<X> stuff(10);

09-26 22:53
查看更多