Здравствуйте эксперты. Как перегрузить оператор [], чтобы можно было: (1) Работать с 2-х мерным массивом. Пример: a[j][i]; (2) Присваивать значения. Пример: x = a[j][i]. -------------------------------------------- Удачи.
Добрый день, kuper! Например, так как в приложении. С уважением, Avl2k.
Приложение: Ответ отправлен: 25.11.2002, 17:15 Отправитель: Avl2k Отвечает vitya
Приветствую Вас, kuper! все просто int * operator[](const unsigned int uiIndex) { return buf[uiIndex]; } После чего mat[i][j] - уже будет работать. Ответ отправлен: 23.11.2002, 15:15 Отправитель: vitya Отвечает Валентин
Приветствую Вас, kuper! В любой реализации С++, оператор [] вызывается с одним аргументом. Имитация многомерного массива возможна с помощью введения дополнительного класса, т.е. class Index{ int x,y; Index(int inX,inY):x(inX),y(inY){}; }
class YourClass { YourClass& operator[](Index inIndex) } Это решение взято из книги Д.Элдриджа "С++". И в принципе не подводило никогда.
Ответ отправлен: 24.11.2002, 03:18 Отправитель: Валентин Отвечает Jadd
Здравствуйте, kuper! Непонятно, зачем перегружать? Ты прости, купер, но я что-то не совсем понял. Причем тут перегрузка? Прегрузка операторов применяется в тех ситуациях, когда их стандартного применения просто не достаточно. Есть и иные случаи. То что ты просишь - вполне стандартная ситуация и специальной перегрузки не требует. Ответ отправлен: 26.11.2002, 02:50 Отправитель: Jadd
Вопрос № 383
vitya спасибо за помошь. Но я немогу понять как проверять границы многомерного массива? Если это возможно то как?
Доброе время суток, kuper! Можно сделать так как в приложении. С уважением, Avl2k.
Приложение: Ответ отправлен: 25.11.2002, 17:31 Отправитель: Avl2k Отвечает Валентин
Приветствую Вас, kuper! Просто проверяй по кажому измерению. Хотя в принципе людой многомемрный массив может быть в чонесном итоге оптимизирван до 2мерного(максимум). Кстати Г.Буч в своих книгах не советует использовать массивы размерности более 2(в действительности маассив любой размерности в конечном итоге вссего лишь непрерывная область памяти, тоо есть 1мерный массив).
Ответ отправлен: 24.11.2002, 03:08 Отправитель: Валентин Отвечает vitya
Доброе время суток, kuper!
Для этого ты можешь сделать так: напиши класс аналогичный std::vector, в котором перегрузи оператор [], примерно следующим образом: int operator[](const UINT uiIndex) { if (uiIndex >= uiSize) throw -1; //или что тебе больше нравится else return arr[uiIndex]; } теперь представляешь матрицу в виде массива таких векторов, и каждый вектор сам будет заботиться о том, чтобы случайно не произошло обращение по несуществующему индексу. IntVector & operator[](const UINT uiIndex) { return mat[uiIndex]; } Обрати внимание, что возвращать надо ссылку, а то будет во-первых много лишнего копирования, во вторый может произойти ошибка. Ответ отправлен: 24.11.2002, 10:59 Отправитель: vitya Отвечает --- Нет данных ---
Здравствуйте, kuper! Если массив статический, то есть объявлен как type myarray[size1][size2]; то проверять можно так, рассмотрим фрагмент кода: cout << "Enter i_and j _ and v"; cin >> i>>j>>v; if ((i>=0)_ &&_ (j>=0)) if ( (i<=size1)_ && (j<=size2)) { myarray[i][j]=v; } else cout << "Out of range"; Если массив динамический_ то вы держите его длину в отдельной переменнной_ а так все так же: type_ **A; **A=new type*[size1]; for (int i=0 ; i< size1; i++) A[i]=_new type[size2]; .. A[i][j]=v; ...
Ответ отправлен: 24.11.2002, 13:28 Отправитель: --- Нет данных ---
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.