| Перегрузка операторов в 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++, то можно применить индексированное свойство:
Может, не совсем то, но зато два индекса! Атмосферная музыка — 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) Реализовать оператор [] так, чтобы он тоже возвращал некоторый массив, уже одномерный. Тогда можно использовать запись:
2) Перегрузить оператор (), он может принимать много параметров.
3) Создать класс Index, и реализовать оператор [], работающий с этим классом:
4) Просто реализовать функцию GetElement:
Вообще в С++ нет строенных многомерных массивов. Нельзя создать некоторый массив и обращаться к нему, как 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]) |