1

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

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

#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]]where a 是用于子索引的数组的值。我不想修改现有的源代码。需要添加任何可以改变行为的新功能。

由于在我的代码中访问索引运算符的地方太多(准确地说是 536 个),并且索引下标运算符内部有复杂的公式,所以我不倾向于在很多地方更改代码。


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

所以只想再次确认我的理解以及是否有任何可能的捷径可以实现。
否则我需要通过更改每一行代码的皇家方法来修复它:)。

4

2 回答 2

3

是的,不可能定义所有参数都是内置类型的自定义运算符(这包括原始指针)。

此外,像这样以不明显的方式定义运算符几乎总是不是一个好主意。

您可能需要考虑将原始指针X替换为行为类似的类。这可能更容易,具体取决于您的代码(例如,如果您有很多模板)。

于 2010-05-24T14:18:51.790 回答
2

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

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

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);.

于 2010-05-24T14:29:59.603 回答