Как изменить значение оператора доступа указателя - PullRequest
1 голос
/ 24 мая 2010

Это может быть очень очевидный вопрос, простите меня, если так.

У меня есть фрагмент кода из моего проекта,

#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). Я не могу переопределить базовый оператор '+'.

Так что просто хочу подтвердить мое понимание, и если есть какие-либо возможные сокращения, чтобы достичь.
Иначе мне нужно исправить это королевским методом изменения каждой строки кода :).

Ответы [ 2 ]

3 голосов
/ 24 мая 2010

Да, невозможно определить пользовательские операторы, в которых все аргументы имеют встроенные типы (включая необработанные указатели).

Кроме того, почти всегда не очень хорошо определять операторы неочевидным образом, как этот.

Вы можете рассмотреть возможность замены необработанного указателя на X с классом, который ведет себя как единое целое. Это может быть проще, в зависимости от вашего кода (например, если у вас много шаблонов).

2 голосов
/ 24 мая 2010

Как говорит Алекс, ваше «субиндексирование» использования [] было бы совершенно неочевидным для любого, кто читает ваш код.

Тем не менее, вы можете определить класс, такой как:

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

...