Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на C / C++

Выпуск № 131
от 27.11.2002, 00:50

Администратор:
Имя: Nick.Box
URL: Информационный ресурс
ICQ: 365124
[censored], [censored]
О рассылке:
Задано вопросов: 389
Отправлено ответов: 843
Активность: 216.7 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Avl2k
Статус: Доверительный
Общий рейтинг: 127.19
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108.27
[Подробней >>]
Валентин
Статус: Начальный
Общий рейтинг: 102.85
[Подробней >>]
 
Jadd
Статус: Профессиональный
Общий рейтинг: 140.11
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 382. Здравствуйте эксперты. Как перегрузить оператор [], чтобы можно было: (1) Работать с 2-х мерным масс... (ответов: 4)
Вопрос № 383. vitya спасибо за помошь. Но я немогу понять как проверять границы многомерного массива? Если это воз... (ответов: 4)

Вопросов: 2, ответов: 8


 Вопрос № 382

Здравствуйте эксперты.
Как перегрузить оператор [], чтобы можно было:
(1) Работать с 2-х мерным массивом.
Пример: a[j][i];
(2) Присваивать значения.
Пример: x = a[j][i].
--------------------------------------------
Удачи.


Приложение:


Вопрос отправлен: 23.11.2002, 14:34
Отправитель: kuper

[Следующий вопрос >>] [Список вопросов]

Отвечает Avl2k

Добрый день, 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 спасибо за помошь.
Но я немогу понять как проверять границы многомерного
массива?
Если это возможно то как?



Вопрос отправлен: 23.11.2002, 19:24
Отправитель: kuper

[Следующий вопрос >>] [Список вопросов]

Отвечает Avl2k

Доброе время суток, 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.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (42)
C / C++ (29)
Perl (9)
Delphi (14)
Pascal (23)
Basic / VBA (11)
Java / JavaScript (15)
PHP (10)
MySQL / MSSQL (9)
Пользователю
Windows 95/98/Me (35)
Windows NT/2000/XP (23)
"Железо" (28)
Поиск информации (17)
Администратору
Windows NT/2000/XP (12)
Linux / Unix (18)
Юристу
Гражданское право (7)
Семейное право (2)
Трудовое право (3)
КоАП (2)

Отправить вопрос всем экспертам выбранной рассылки.




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное