Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с использованием перегруженного [] 
:(
    Опции темы
GremlinProg
Дата 14.10.2005, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



Цитата
честно говоря, не понял, что имелось в виду...

при вызове realloc(lpmem,newsize), lpmem может поменять базу, в этом случае, если в программе, где-то хранятся указатели на элементы lpmem, их нужно обновить в соответствии с новой базой, иначе при обращении к любому из таких указателей произойдёт наша любимая "Access violation"

нотификация(notification) - это шаблонный или виртуальный метод, который вызывается как раз в момет смены базы.
Добавлено @ 18:24
Цитата
Просвети...

В этом случае код просто не откомпилится, пока ты не опишешь в классе X конструктор по-молчанию. Я это к тому, что оператор TYPE [] накладывает свои ограничения на TYPE. В данном случае это очевидно.

Не всегда можно описать конструктор по-умолчанию. Если в классе есть поля типа TYPE&, то их надо в любом случае инициировать. Если в .NET можно написать так: *(TYPE*)NULL, то в C++ 6.0 этого сделать нельзя, т.к. компилятор сразу подставляет в такие места что-то вроде mov eax,[ecx], где ecx = 0 (Надеюсь идея ясна)

Это сообщение отредактировал(а) GremlinProg - 14.10.2005, 18:42


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
LPBOY
Дата 14.10.2005, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(GremlinProg @ 14.10.2005, 18:19)
В этом случае код просто не откомпилится, пока ты не опишешь в классе X конструктор по-молчанию. Я это к тому, что оператор TYPE [] накладывает свои ограничения на TYPE. В данном случае это очевидно.

Кто виноват если ты не определил конструктор по умолчанию для Х, а потом пишешь:
Цитата
X null;

Если правильно написать оператор[], то и проблем не будет.
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
srd
Дата 14.10.2005, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Полагаю, что вместо возвращения null оператор[] должен в случае ошибки бросить исключение, либо вообще не делать никаких проверок. Семантика у него такая - не делать проверок smile)


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
GremlinProg
Дата 14.10.2005, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



Цитата
Кто виноват если ты не определил конструктор по умолчанию для Х, а потом пишешь

Никто, просто это говорит об ограниченности класса, а если тебе нельзя по другому(см. предыд. ответ) тоты просто пишешь свой класс, вместо встроенного. Вот они, частные случаи.
Добавлено @ 18:49
Цитата
Полагаю, что вместо возвращения null оператор[] должен в случае ошибки бросить исключение, либо вообще не делать никаких проверок. Семантика у него такая - не делать проверок

Правильно, тогда чем отличается [] от TYPE smile ?
Упс, совсем из головы вылетело:

меня собственно заинтересовал момент перегрузки TYPE&operator[] и const TYPE&operator[].
Допустим есть функция:
Код

void somefunc(const TYPE&){}

и
Код

void somefunc(TYPE&){}

Если вызвать её так:
Код

somefunc(myobject[i])

то компилятор сообщит об ошибке "ambrigous access", т.е. непонятно какой оператор вызвать c const TYPE&, или TYPE&. Так вот в случае с operator TYPE*(), этой ошибки никогда не произойдёт, я специально этот момент проверял (в своё время очень нужно было).

Это сообщение отредактировал(а) GremlinProg - 14.10.2005, 19:13


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Earnest
Дата 16.10.2005, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



По-моему ты куда-то не туда загнул.
Сравнивать оператор приведения и извлечения по индексу бессмысленно, это совершенно разные операции. Оператор приведения типа многие гуру (в частности, Майерс) считают опасным и рекомендуют использовать как можно реже. Т.е. только в тех случаях, когда его семантика очевидна. Например, в классах-оболочках. А заменять ими оператор доступа к элементу контейнера - полная ересь.


--------------------
...
PM   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.