0 / 0 / 0
Регистрация: 27.07.2010
Сообщений: 7
|
|||||||||||
1 | |||||||||||
Виртуальные функции.27.07.2010, 15:26. Показов 1315. Ответов 18
Метки нет (Все метки)
Приветствую всех. Дана такая программа (на самом деле она больше и сложнее, но структура и проблема те же):
то все ок. Я даже глупо переписал пример из самоучителя ! эффекта ноль. Теперь грешу на компилятор... Так в чем же дело...
0
|
27.07.2010, 15:26 | |
Ответы с готовыми решениями:
18
Виртуальные и чисто виртуальные функции Виртуальные функции Виртуальные функции виртуальные функции |
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
|
|
27.07.2010, 15:40 | 2 |
Вы присваиваете указателям адреса временных объектов. Когда дело доходит до цикла, этих объектов уже не существует.
0
|
0 / 0 / 0
Регистрация: 27.07.2010
Сообщений: 7
|
|
27.07.2010, 15:47 [ТС] | 3 |
Но почему тогда выводится 3 3 3, а не еще что-нибудь...
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
27.07.2010, 16:04 | 4 |
Эм. Выводит 1, 2, 3 по вашему коду.
0
|
0 / 0 / 0
Регистрация: 27.07.2010
Сообщений: 7
|
|
27.07.2010, 16:08 [ТС] | 5 |
Что за компилятор??
Запустите кто-нибудь эту прогу и скажите что у вас выводит...
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
27.07.2010, 16:10 | 6 |
maxibon, IDE Visual Studio 2005.
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
27.07.2010, 16:12 | 7 | |||||
Аналогично. Может быть, приведешь уже весь код?
А вообще rangerx прав, и нужно бы сделать так (особенно, если классы у тебя имеют данные-члены):
0
|
0 / 0 / 0
Регистрация: 27.07.2010
Сообщений: 7
|
|
27.07.2010, 16:14 [ТС] | 8 |
это не компилятор а среда разработки// ладно, попробую зпускать show без цикла, а сразу после присваивания ему объекта. Всеи кто ответил спасибо1
0
|
ForEveR
|
27.07.2010, 16:16
#9
|
Не по теме: maxibon, А IDE я просто так перед названием написал да?) Я знаю, что это среда разработки)
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
27.07.2010, 16:19 | 10 |
А может выводить хоть "Hello, World!", если заблагорассудится. Временных объектов уже не существует, а обращение (по указателю) к несуществующему объекту - это UB. Как именно это UB проявится - это Б.Г. его знает....
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
27.07.2010, 16:29 | 11 |
Это ничего не изменит, т.к. ты инициализируешь указатели временными объектами, которые уничтожаются сразу после инициализации.
0
|
0 / 0 / 0
Регистрация: 27.07.2010
Сообщений: 7
|
|||||||||||
27.07.2010, 16:36 [ТС] | 12 | ||||||||||
Самое интересное что изменит. Я ж еще этот вариант
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
27.07.2010, 16:45 | 13 | |||||
Как сказал CheshireCat, поведение твоей программы не определено, о чем уже говорит то, что не у всех твой вариант работает. Согласись, правильно написанная программа должна работать у всех и всегда.
Пойми, что так делать - неправильно. Если ты будешь использовать в дальнейшем такой "трюк", то неприменно столкнешься с ошибками. Опять-таки повторюсь: , поэтому не имеет значения, когда ты будешь вызывать свою функцию. Потому, что:
1
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
28.07.2010, 06:45 | 15 | |||||
Evg, здесь создается временный (безымянный) объект типа x1 (при этом вызывается конструктор по умолчанию для временного объекта), и его адрес присваивается указателю на x1. Но соль в том, что после присваивания адреса временный объект уничтожается, и указатель хранит адрес уже не существующего объекта.
Вот пример того, как можно было бы использовать временные объекты:
1
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
||||||
28.07.2010, 09:30 | 16 | |||||
То что ты написал, как было сказано выше, приводит к UB. Это означает что поведение твоей программы неопределено и будет зависеть от используемого компилятора. Например такой код (не сильно от твоего отличающийся) прекрасно работает в MSVS:
Поэтому вместо того, чтобы спорить, прислушайся к тому, что было сказано выше.
0
|
28.07.2010, 13:09 | 17 |
Всё, наконец допёрло. Это ж не вызов конструктора, а создание экземпляра класса на лету. Моя тормоз
Это понятно. Мне непонятна была лишь конструкция языка.
0
|
34 / 34 / 8
Регистрация: 07.06.2010
Сообщений: 118
|
|
28.07.2010, 16:50 | 18 |
Я про временные обьекты первый раз прочиталО_о
После чего уничтожаются временные обьеты ? в википедии написано
0
|
28.07.2010, 16:55 | 19 |
Объекты должны уничтожаться по завершению statement'а. В данном случае - грубо говоря по достижению ";"
1
|
28.07.2010, 16:55 | |
28.07.2010, 16:55 | |
Помогаю со студенческими работами здесь
19
Виртуальные функции Виртуальные функции виртуальные функции Виртуальные функции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |