这可能是一个非常明显的问题,请原谅我。
我的项目中有以下代码段,
#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)。我无法重新定义基本运算符'+'。
所以,只想再确认一下我的理解,以及是否有任何可能的捷径可以实现 否则,我需要通过改变每行代码的皇家方法来解决它。
答案 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);
。