Перегрузка операторов в C++ в избранное  новое горячее всё    подписка   модер. 
От: Аноним 264 
Дата: 29.05.08 04:02
Уважаемый people, подскажите можно ли перегрузить оператор [] так, чтобы он принимал не один параметр, а два?
Т.е. чтобы сделать класс матрицу и обращаться к нему как-то так double x=a[i,j];
Это реально?
Re: Перегрузка операторов в C++ в избранное  новое    модер. 
От: ilnar 
Дата: 29.05.08 04:06
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Уважаемый people, подскажите можно ли перегрузить оператор [] так, чтобы он принимал не один параметр, а два?

А>Т.е. чтобы сделать класс матрицу и обращаться к нему как-то так double x=a[i,j];
А>Это реально?

нет. [] — доступ по индексу, одному, и этой идеи не поменяешь.
можно использовать () с несколькими параметрами
Re: Перегрузка операторов в C++ в избранное  новое    модер. 
От: kvser 
Дата: 29.05.08 04:08
Здравствуйте, Аноним, Вы писали:

А>Уважаемый people, подскажите можно ли перегрузить оператор [] так, чтобы он принимал не один параметр, а два?

А>Т.е. чтобы сделать класс матрицу и обращаться к нему как-то так double x=a[i,j];
А>Это реально?

два параметра оператор [] не принимает
для этого можно применять последовательность операторов []: matrix[i][j]
В этом выражении один operator[] возвращает, к примеру вектор, затем второй operator[] применяется к этому вектору и возвращает конкретный элемент
Re: Перегрузка операторов в C++ в избранное  новое    модер. 
От: night beast 
Дата: 29.05.08 04:14
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Уважаемый people, подскажите можно ли перегрузить оператор [] так, чтобы он принимал не один параметр, а два?

А>Т.е. чтобы сделать класс матрицу и обращаться к нему как-то так double x=a[i,j];
А>Это реально?

теоретически, реально. если сделать i и j особым типом и перегрузить для него оператор ","
на практике, для этой конкретной ситуации, особого смысла нет...
Re: Перегрузка операторов в C++ в избранное  новое    модер. 
От: dmitry_npi 
Дата: 29.05.08 04:39
Оценка: +2 :)
Здравствуйте, Аноним, Вы писали:

А>Уважаемый people, подскажите можно ли перегрузить оператор [] так, чтобы он принимал не один параметр, а два?

А>Т.е. чтобы сделать класс матрицу и обращаться к нему как-то так double x=a[i,j];
А>Это реально?

Если вы пользуетесь Visual C++, то можно применить индексированное свойство:

class Matrix
{
private:
  int **array;
public:
  int getItem(int i, int j);
  void setItem(int i, int j, int newVal);
  __declspec(property(get=getItem, put=setItem)) int M[][];
};
...
Matrix m;
m.M[3][5] = 5;


Может, не совсем то, но зато два индекса!
Атмосферная музыка — www.aventuel.net
Re[2]: Перегрузка операторов в C++ в избранное  новое    модер. 
От: Erop 
Дата: 29.05.08 05:21
Оценка: +1 :)
Здравствуйте, kvser, Вы писали:

K>для этого можно применять последовательность операторов []: matrix[i][j]

K>В этом выражении один operator[] возвращает, к примеру вектор, затем второй operator[] применяется к этому вектору и возвращает конкретный элемент

Только имеено вот std::vector в таком месте использовать всё-таки негуманно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Перегрузка операторов в C++ в избранное  новое    модер. 
От: alzt 
Дата: 29.05.08 06:11
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Уважаемый people, подскажите можно ли перегрузить оператор [] так, чтобы он принимал не один параметр, а два?

А>Т.е. чтобы сделать класс матрицу и обращаться к нему как-то так double x=a[i,j];
А>Это реально?

Нет.
Есть обходные пути:
1) Реализовать оператор [] так, чтобы он тоже возвращал некоторый массив, уже одномерный.
Тогда можно использовать запись:
double x=a[i][j];


2) Перегрузить оператор (), он может принимать много параметров.
double x=a(i, j);


3) Создать класс Index, и реализовать оператор [], работающий с этим классом:
double x=a[Index(i,j)];


4) Просто реализовать функцию GetElement:
double x=a.GetElement(i,j);


Вообще в С++ нет строенных многомерных массивов. Нельзя создать некоторый массив и обращаться к нему, как a[i,j].
Поэтому и от производных объектов ожидать такого поведения не следует.
Re: Перегрузка операторов в C++ в избранное  новое    модер. 
От: Кодт модератор 
Дата: 29.05.08 07:00
Здравствуйте, <Аноним>, Вы писали:

А>Уважаемый people, подскажите можно ли перегрузить оператор [] так, чтобы он принимал не один параметр, а два?

А>Т.е. чтобы сделать класс матрицу и обращаться к нему как-то так double x=a[i,j];
А>Это реально?

Задумаемся немножко об expression templates...

Каждый [] возвращает срез, фиксированный строго по первому индексу.
cube — куб
cube[x0] — квадрат в плоскости YZ
cube[x0][y0] — линия по оси Z
cube[x0][y0][z0] — точка

Чтобы получить квадрат в плоскости XZ, придётся выкручиваться:
cube[__][y0] — квадрат в плоскости XZ
cube[__][y0][t0] — линия по оси... X или Z?
cube[__][y0][t0][u0] — точка... какая-то...

cube[__][__][z0] — квадрат в плоскости XY
cube[__][__][z0][x0] — было бы логично, что четвёртый индекс это X
cube[__][__][z0][x0][y0] — точка.
Значит, в предыдущем случае T==X, U==Y

Ну и так далее
cube[x0][__][z0][y0]
cube[x0][__][__][y0][z0]

cube[__][y0][__][x0][z0]

Прикольно и даже где-то логично. Но скорее путанно, чем логично.
Приятнее (имхо) было бы делать так:
cube(x0,__,__)(y0,z0)
cube(__,y0,__)(x0,z0)
cube(__,y0,z0)(x0)

или в стиле boost/bind
cube(_1,y0,_1)(xz0)
cube(_1,y0,_2)(x0,z0)

Последнее, кстати, достаётся нахаляву: если у cube есть operator()(?,?,?), то
bind(cube,_1,y0,_1)(xz0)



А как делать срезы по первой схеме, на [__] — это, имхо, неплохой этюд для программистов
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Перегрузка операторов в C++ в избранное  новое    модер. 
От: Vamp 
Дата: 29.05.08 13:26
Оценка: +1
A>Есть обходные пути:
A>1) Реализовать оператор [] так, чтобы он тоже возвращал некоторый массив, уже одномерный.

Не обязательно массив. Достаточно, чтобы он возвращал объект, к которому применим оператор [].
Да здравствует мыло душистое и веревка пушистая.
Re: Перегрузка операторов в C++ в избранное  новое    модер. 
От: Аноним 171 
Дата: 29.05.08 13:50
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Уважаемый people, подскажите можно ли перегрузить оператор [] так, чтобы он принимал не один параметр, а два?

А>Т.е. чтобы сделать класс матрицу и обращаться к нему как-то так double x=a[i,j];
А>Это реально?

#define [x,y] ([x][y])