如何更改指针访问运算符的含义

时间:2010-05-24 14:07:40

标签: c++ function operator-overloading operators multiple-definition-error

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

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

#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:
我试过操作员超载并得出结论,这是不可能的 2. p [i]也将转换为*(p + i)。我无法重新定义基本运算符'+'。

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

2 个答案:

答案 0 :(得分:3)

是的,无法定义自定义运算符,其中所有参数都是内置类型(包括原始指针)。

以这种非显而易见的方式定义运算符几乎总是不太好。

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

答案 1 :(得分:2)

正如Alex所说,对于阅读代码的人来说,[]的'子索引'用法完全不明显。

那就是说,你可以定义一个这样的类:

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