|
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
|
||||||
Вызов конструктора базового класса20.12.2025, 04:05. Показов 1195. Ответов 22
Добрый день!
Вопрос по упражнению 2 из главы 9 "Наследование" книги, указанной в теме Суть упражнения: нужно создать порожденный класс Pstring от базового "самопального" класса String. класс String превращает строки типа char в объекты этого класса класс Pstring позволять ограничивать длину строки, если она превышает размер строки установленный в базовом классе String Подскажите пожалуйста, почему компилятор не хочет выполнять конструктор с одним аргументом в базовом классе, запускаемый из порожденного класса в фрагменте кода в строке 31 "...else String(s);..." Компилирую код в Visual Studio 2019 Заранее спасибо! код программы по упражнению 2
0
|
||||||
| 20.12.2025, 04:05 | |
|
Ответы с готовыми решениями:
22
Вызов конструктора базового класса из класса-наследника Вызов конструктора базового класса Знакомство с наследованием. Вызов конструктора базового класса |
|
фрилансер
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,986
|
|||||||
| 20.12.2025, 06:57 | |||||||
|
можно переделать, например, так (функция MakeFrom)
Добавлено через 51 секунду но без проверки длины - опасно так делать всё равно
0
|
|||||||
|
Вездепух
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
|
||
| 20.12.2025, 09:14 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
|
||||||||
| 20.12.2025, 09:44 [ТС] | ||||||||
|
Согласен Ваше решение имеет право на жизнь. Но вот это именно и непонятно почему решение с безымянным объектом не работает - оно выглядит более элегантно (использует конструктор в базовом классе), и при условии, что у нас класс String такой какой есть и его "условно изменять нельзя". Да есть и другое решение, например 33 строку в моем коде см. ниже с безымянным объектом можно заменить просто на повторение аналогичного кода в конструкторе c одним аргументом класса String "... strcpy_s(str, s);..." Но данное решение, требует копировать код, а нужно повторно использовать код заложенный в конструкторе c одним аргументом класса String. Собственно вопрос не в том как сделать программу работоспособной, а хочется понять почему Visual Studio 2019 не позволяет в моем случае использовать безымянный объект. Может с 2004 года это было умышленно изменено в стандарте C++? Хочется это понять. И вообще как по мне странно, что в данной ситуации нельзя использовать безымянный объект и конструктор с одним аргументом в базовом классе. Такое ощущение, что в Visual Studio 2019 это специально запретили, но зачем, вот и хочу понять.
0
|
||||||||
|
Вездепух
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
|
|||
| 20.12.2025, 10:28 | |||
|
0
|
|||
|
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
|
||
| 20.12.2025, 12:04 [ТС] | ||
|
Заранее спасибо!
0
|
||
|
1061 / 982 / 153
Регистрация: 10.08.2015
Сообщений: 5,327
|
|
| 20.12.2025, 13:19 | |
|
ткни пальцем где у тебя безымянный объект
0
|
|
|
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
|
|||||
| 20.12.2025, 13:37 [ТС] | |||||
|
0
|
|||||
|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
|||||||
| 20.12.2025, 15:11 | |||||||
|
У вас пока нет понимания, зачем вообще нужны классы, и как с ними работать. По-хорошему, логика инициализации объектов классов содержится в конструкторах этих классов, а не где-то ещё. Собственно, классы для того и существуют, что бы инкапсулировать некоторую логику внутри себя. Воспринимайте классы, как своего рода инструменты, которые умеют делать для вас некоторую полезную работу. Дрелька лучше всех знает, как ей правильно сверлить. Телефон лучше всех знает, как ему правильно звонить. Класс String лучше всех знает, как ему инициализировать собственные данные, и манипулировать ими.А вы, в своем классе Pstring попытались через голову String манипулировать его данными.Это - логическая ошибка. Следующий код похож на ваш, но теперь логика инициализации String содержится в самом String, в соответствии с логикой здравого смысла:
Pstring оказался пустышкой.В данном случае получается, что Pstring не нужен.
0
|
|||||||
|
Вездепух
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
|
||
| 20.12.2025, 17:05 | ||
|
Я уже написал вам выше, что в рассматриваемой строчке молча создается и мгновенно уничтожается безымянный временный объект. Именно это вы написали в своём коде. Именно это и происходит. То есть все "так". О каком "не так" вы ведете речь? Чем вам не нравится то, что происходит в коде?
0
|
||
|
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
|
|||||
| 20.12.2025, 17:31 [ТС] | |||||
|
Но тот код что вы предложили подразумевает корректировку класса String У меня задача и в упражнении 2 - не трогая код класса String добиться ограничения длинны строки за счет порожденного класса Pstring, т.е. понять и отработать одну из возможностей наследования - улучшить возможности грубо говоря класса String в данном случае. Я пока все таки не понимаю, почему фрагмент Или почему так делать нельзя, хотя у Р.Лафоре именно так так и приведен код. Там конечно есть и другие косяки в книге, но с ними мне удается пока справляться и есть понимание, а тут прям хочется разобраться. Если объясните почему не запускается конструктор с одним аргументом в базовом классе или объясните почему тут это не работает буду Вам очень благодарен! Может нужно просто в дугой версии Visual Studio попробовать или вообще взять компилятор Вorland? Если есть у кого-нибудь возможность пошаговово пропустить мой код например в Visual Studio 2025, если такой есть буду благодарен! Заранее спасибо! Добавлено через 11 минут В общем ладно понял в теле конструктора не работают видимо безымянные объекты. Ладно всем спасибо буду знать Или вроде начал понимать - в списке инициализации String(s) и в теле конструктора String(s) это не одно и тоже: в списке инициализации String(s) - как раз вызов конструктора в базовом классе с одним аргументом а в теле конструктора String(s) - это да просто безымянный объект причем совершенно другой никак не связанный с моими объектами Pstring s1 и Pstring s2
0
|
|||||
|
Вездепух
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
|
|||||
| 20.12.2025, 17:57 | |||||
|
В списке инициализации конструктора эта конструкция вызывает инициализацию базового подобъекта вашего объекта. А конструкция в строке 31 никакого отношения к базовому подобъекту уже не имеет. --- А в остальном: да, эта строка в итоге вызывает конструктор с одним аргументом. Но она вызывает его для совсем другого объекта - для временного безымянного объекта, который в этом месте создается и тут же уничтожается (бессмысленное действие). К вашему "базовому классу" этот объект не имеет никакого отношения. На ваш конструируемый объект это не оказывает никакого влияния. Что вы и наблюдаете.
1
|
|||||
|
379 / 322 / 65
Регистрация: 14.10.2014
Сообщений: 1,373
|
|||||||
| 20.12.2025, 18:19 | |||||||
|
Кликните здесь для просмотра всего текста
Добавлено через 2 минуты это исходник для книги
1
|
|||||||
|
Вездепух
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
|
||
| 20.12.2025, 18:24 | ||
|
У меня уже вылетело из головы, "что мы думаем про Лафоре". Но я "поднял картотеку" и вижу, что там все плохо Не получается вывести строку через метод класса (выводит пустоту) (та же тема) Ошибки в книги Р.Лафоре "Объектно-Ориентирование программирование в C++" Error C4430: отсутствует спецификатор типа - предполагается int - как исправить? Ошибка: namespace "geoo" has no member "ch"
1
|
||
|
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
|
||
| 20.12.2025, 18:44 [ТС] | ||
|
Чувствовал, что там что-то не так). Но с другой стороны очень доступно написано. Если б не было ошибок в книге, то книга супер. С такой подачей материала пусть и с ошибками я аналогов не встречал. Даже думал, что ошибки сделаны специально, чтобы тот кто хочет разобраться их бы сам исправлял. С этой вот ошибкой сам не смог справиться, поэтому и обратился сюда. Еще раз Спасибо!
0
|
||
|
379 / 322 / 65
Регистрация: 14.10.2014
Сообщений: 1,373
|
||
| 20.12.2025, 18:44 | ||
|
TheCalligrapher Сам я тоже начинал с этой книги, но когда-то давно, то ли вы, то ли ещё кто-то с этого форума мне сообщали, что книга эта мягко говоря так себе.... Вот теперь я понимаю почему....
0
|
||
|
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
|
|
| 20.12.2025, 18:49 [ТС] | |
|
0
|
|
|
379 / 322 / 65
Регистрация: 14.10.2014
Сообщений: 1,373
|
|
| 20.12.2025, 18:50 | |
|
Но объяснения самой сути ООП лучше чем в этой книге я тоже нигде более не находил
В общем - если не заморачиваться синтаксисом и прочими конструкциями, а просто постигать саму концепцию - то это, вероятно, будет лучшая книга для новичка.
1
|
|
|
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 12
|
|
| 20.12.2025, 18:53 [ТС] | |
|
0
|
|
|
Вездепух
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
|
||
| 20.12.2025, 19:04 | ||
|
0
|
||
| 20.12.2025, 19:04 | |
|
Помогаю со студенческими работами здесь
20
Вызов конструктора базового класса из порожденного
Создание базового класса. Наследование от базового класса
Вызвать конструктор производного класса без конструктора базового класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|