|
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 45
|
||||||||||||||||
Передача по ссылке01.08.2019, 12:45. Показов 4627. Ответов 31
Задание №8 из книги "Объектно-ориентированное программирование в С++", 4-е издание, Роберт Лафоре, 2004г.
В некоторых компьютерных языках, таких, как Visual Basic, есть операции, с помощью которых можно выделить часть строки и присвоить её другой строке. (В стандартном классе string предложены различные подходы.) Используя наследование, добавьте такую возможность в класс Pstring из упражнения 2. В новом производном классе Pstring2 разместите три новых функции: left(), mid() и right().
временный объект класса Pstring2, который затем их возвратит. Для получения лучшего результата используйте в этих функциях возврат по ссылке, чтобы они могли быть использованы с левой стороны знака "равно" для изменения существующей строки. Мой код:
Если делать через временный объект:
временный объект. И эти функции я не могу использовать слева от знака равно "=". Можно еще создать глобальный объект класса Pstring2. Тогда будет работать передача по ссылке, можно использовать слева от знака равно, но глобальный объект != временный объект. Заранее спасибо.
0
|
||||||||||||||||
| 01.08.2019, 12:45 | |
|
Ответы с готовыми решениями:
31
Передача по ссылке
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 01.08.2019, 13:14 | |||||||
|
Здесь, наверное надо как-то так (на примере std::string, для простоты)
0
|
|||||||
|
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 45
|
||||||
| 01.08.2019, 13:23 [ТС] | ||||||
|
Написать свой класс String предложил сам автор. Я ничего не выдумал. Поэтому и наследуем от него:
0
|
||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 01.08.2019, 13:26 | ||
|
Сделай в классе String метод append - добавление строки в конец, и можешь заменть std::string на свой
0
|
||
|
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 45
|
|
| 01.08.2019, 13:33 [ТС] | |
|
Суть вашего предложения, oleg-m1973, состоит в добавлении строки в конец. Но мой код на данный момент с этим справляется. В этой части я пока не вижу ошибок. А вы?
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 01.08.2019, 13:45 | ||
|
Зато вижу, что код для добавления дублируется в каждой функции. Очевидно, что его надо оформить в отдельный метод. Сравни сколько занимает твоя реализация left и моя Добавлено через 41 секунду Суть моего предложения не в добавлении строки - я просто показал правильную реализацию left(), как в задании
0
|
||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
||
| 01.08.2019, 14:08 | ||
Сообщение было отмечено НовыйПетрович как решение
Решение*this. Однако в этом же задании он упоминает временный объект (что бы за этим не скрывалось), который по ссылке вернуть нельзя. Это противоречащие друг другу пункты.Я решил проверить в чем дело и заглянул в оригинал книги, чтобы узнать что автор имел в виду, в конце есть ответы на задания. К сожалению ответа на задание 8 я не нашел, зато нашел ответы на более ранние задания в этой же главе. Судя по выделенному, автор книги вообще не понимает о чем он пишет. И я теперь не удивлюсь, если он действительно предлагает читателю возвращать локальный объект по ссылке.
1
|
||
|
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 45
|
|
| 01.08.2019, 14:15 [ТС] | |
|
Допустим, oleg-m1973, я согласен с замечанием (хотя в вашей функции не используется цикл for, рекомендуемый автором). Как насчет использования временного объекта и передачи его по ссылке (это более-менее понятно по отдельности, но вместе пока не представляю)?
Добавлено через 4 минуты DrOffset, я на скрине ясно вижу, что в случае, если строка длиннее SZ (80 символов), тогда Лафоре копирует столько, сколько влезет ( я так делал вначале). А там, где вы выделили красным квадратом, будет выполняться, когда строка полностью влазит. Дело в том, что указатель this будет в последующих главах, поэтому задачу нужно решить имеющимися средствами.
0
|
|
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
|||||||
| 01.08.2019, 14:18 | |||||||
|
НовыйПетрович, если брать пример oleg-m1973, то возврат по ссылке может выглядеть вот так и никак иначе:
Если автор книги (с учетом предоставленных материалов оригинала(!) книги на английском) имел в виду что-то другое, то он просто бредит. Добавлено через 1 минуту
1
|
|||||||
|
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 45
|
|
| 01.08.2019, 14:25 [ТС] | |
|
DrOffset, вы не могли бы объяснить подробнее, почему объект создается и сразу удаляется. Мы будем инициализировать любой объект класса Pstring. Код класса - как на картинке. Для этого вызовется конструктор базового класса и все. В чем тут ошибка. Я не защищаю автора, мне надо понять, где он допускает ошибку.
0
|
|
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
||||||||||||
| 01.08.2019, 14:34 | ||||||||||||
Добавлено через 2 минуты Это азы С++ и не может быть опечаткой, слишком много нужно "опечататься", чтобы такое получилось. Вывод - автор не понимает, что он делает неправильно, ну или его литературные рабы не понимают. В любом случае - это показатель качества книги, а значит и качества ваших знаний после ее прочтения.
0
|
||||||||||||
|
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 45
|
|||||||||||
| 01.08.2019, 14:42 [ТС] | |||||||||||
|
Ранее в этой книге автор объяснял, что если мы используем конструктор только для инициализации:
0
|
|||||||||||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
||||||||||||||
| 01.08.2019, 14:54 | ||||||||||||||
|
А вообще, в данном случае даже временного объекта не будет, а будет объявление переменной типа
String с именем s (ибо most vexing parse). А ошибки переобъявления не было только потому, что данное выражение находится в блоке else. И в любом случае делаться будет не то, о чем пишет автор в комментариях.Добавлено через 1 минуту Добавлено через 4 минуты
1
|
||||||||||||||
|
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 45
|
||||||||||||||||
| 01.08.2019, 15:17 [ТС] | ||||||||||||||||
|
Если бы не было этого else/if, то все выглядело бы вот так:
Вернее, если бы мы не делали проверку на размер строки. Тогда объясните мне, почему, когда мы добавляем проверку, то "создается временный безымянный объект, который нельзя использовать"? Чем это не возвращение к предыдущему варианту инициализации? А я пока запущу ваш код и посмотрю на вывод str. Добавлено через 14 минут Я запустил вот такой код:
0
|
||||||||||||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||||||
| 01.08.2019, 15:28 | ||||||||
А текст не выводится вот из-за этого. Здесь ты не вызываешь конструктор String(), а создаёшь объект String, который сразу удаляется
0
|
||||||||
|
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 45
|
||||||||
| 01.08.2019, 15:38 [ТС] | ||||||||
|
Вы случайно не знакомы с gdb? Я бы хотел посмотреть как удаляется этот объект. Добавлено через 3 минуты
0
|
||||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 01.08.2019, 15:38 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 45
|
||
| 01.08.2019, 15:44 [ТС] | ||
|
И все-таки. Означает ли все выше сказанное, что задание в том виде, в котором
оно задано (и временный объект, и передача по ссылке) без использования указателя this (который будет в последующих главах) невозможно? Добавлено через 48 секунд Добавлено через 2 минуты Допустим, я видел удаление объекта в отладчике Visual Studio. Там потом видны нули... Хотелось бы то же самое в gdb. Но это, наверное, не по теме.
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||
| 01.08.2019, 15:49 | ||||
|
Добавлено через 3 минуты
0
|
||||
|
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 45
|
|||
| 01.08.2019, 16:00 [ТС] | |||
|
0
|
|||
| 01.08.2019, 16:00 | |
|
Помогаю со студенческими работами здесь
20
Передача объекта по ссылке Передача вектора по ссылке
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|