【问题标题】:How to change the meaning of pointer access operator如何更改指针访问运算符的含义
【发布时间】:2011-02-23 06:19:24
【问题描述】:

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

我的项目中有以下代码 sn-p,

#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)。我无法重新定义基本运算符“+”。

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

【问题讨论】:

  • Leeeeeek 删除 []ptr ?
  • :),是的,抱歉忘记添加,因为我急于发布问题。 :) 再次。

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!亚历克斯,不错的建议。
【解决方案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&lt;X&gt; stuff(10);。

【讨论】:

  • 你在这个解决方案上打败了我——唯一的事情是将子索引传递给构造函数并从中确定大小会很好。如果可能的话。在正确的上下文中使用,这可能并不像听起来那么奇怪......
  • 是的,当然,但细节对于这个答案并不重要
  • 谢谢!购买尽可能最好的解决方案。尽管我喜欢您提供的上一篇文章(子索引在构造函数中传递的位置..,这会迫使用户采取某些措施)。
猜你喜欢
  • 2012-01-19
  • 2017-07-18
  • 2020-12-24
  • 2021-05-31
  • 2015-12-28
  • 2023-04-08
  • 1970-01-01
  • 2017-10-04
相关资源
最近更新 更多