|
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
|
||||||||||||||||||||||
Инициализация полей класса при наследовании13.03.2017, 23:54. Показов 13669. Ответов 38
Метки нет (Все метки)
Всем добрый вечер.
Возникла у меня небольшая задачка, которую никак не могу решить. Имеем базовый класс с константным полем:
Пытаюсь сделать так :
Люди, скажите, пожалуйста, что ему не нравится ? И как можно проинициализировать константное поле в наследнике ? Спасибо.
1
|
||||||||||||||||||||||
| 13.03.2017, 23:54 | |
|
Ответы с готовыми решениями:
38
Инициализация полей класса Инициализация полей во время объявления класса |
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|||||||
| 14.03.2017, 00:01 | |||||||
|
Ничего не смущает, что в С++ у наследников нельзя создавать имена переменных как у класса родителя?!?! А теперь по делу! Родитель создается в момент вызова конструктора А, он у вас вызывается неявно до вызова инициализации переменной field которой нету в В Таблетка:
2
|
|||||||
|
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
|
||||
| 14.03.2017, 00:12 [ТС] | ||||
![]() Всё равно не то, что хотелось бы...
0
|
||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||||||||||
| 14.03.2017, 00:22 | ||||||||||||||
|
Вот еще пример
Задайте ряд вопросов - всё разберём! Добавлено через 4 минуты
1
|
||||||||||||||
|
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
|
|||
| 14.03.2017, 00:24 [ТС] | |||
|
0
|
|||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|||||
| 14.03.2017, 00:28 | |||||
|
1
|
|||||
|
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
|
||||||
| 14.03.2017, 00:53 [ТС] | ||||||
|
Мда... Я начинаю понимать, что и ничего не понимаю...
![]() Попробую описать общую задачу. Имеем базовый класс. У него есть свой конструктор. Он вызывается раньше всех производных конструкторов - в этом, как раз у меня и проблема. Мне необходимо, создавая наследника, проинициализировать переменную раньше, чем вызовется конструктор базового класса. Для примера :
0
|
||||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|||||||
| 14.03.2017, 00:59 | |||||||
|
Если рассуждать от обратного, то наследник, по вашей логике, инициализирует поле родителя. А если он этого не сделает? Она будет в подвешенном состоянии? Ну вот забыл родитель это сделать .... . После вызова конструтора родителя объект, что внутри родителя должен уже быть в полной боевой готовности!
0
|
|||||||
|
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
|
||||||
| 14.03.2017, 01:03 [ТС] | ||||||
|
На этот случай в родителе дефолтное значение :
Как раз, таки, мне это и нужно. Если в наследнике не указать значение, то оно будет неким по-умолчанию. Это один из моментов в моей задаче.
0
|
||||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||||
| 14.03.2017, 01:12 | ||||||||
Добавлено через 3 минуты alkl, нельзя в списки инициализации наследника инициализировать поля родителя, потому что они уже проинициализированы - смотрите еще раз пример с MustBeInited() Добавлено через 4 минуты Еще довод: http://en.cppreference.com/w/c... lizer_list
and non-static subobjects data members ? Нету такой - потому, что это не верно
1
|
||||||||
|
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
|
||
| 14.03.2017, 01:13 [ТС] | ||
|
Будем дальше думать, спасибо...
0
|
||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||
| 14.03.2017, 01:15 | ||
Cannot init base class member - он не подозревает, что вы хотите невозможного
1
|
||
|
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
|
|||
| 14.03.2017, 01:23 [ТС] | |||
![]() В общем, картина стала ясна. Будем кумекать, как лучше сделать ... Хочется иметь некоторые переменные по-умолчанию, а при создании наследника, иметь возможность их изменять до вызова базового конструктора. Причём, хотелось бы это делать в виде списка инициализации.
0
|
|||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||||
| 14.03.2017, 01:25 | ||||||||
_q(18) описал в посте после фразы Еще довод:. Он не верит своим двоичным сердцем, что вы настолько ошибаетесь, что пытаесь проинить то, что не можете - что можно проинить описано по ссылке http://en.cppreference.com/w/c... lizer_list
1
|
||||||||
|
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
|
|||||||||||
| 14.03.2017, 01:35 [ТС] | |||||||||||
|
Значит, по мнению компилятора, в случае
Картина ещё интереснее разворачивается
0
|
|||||||||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 14.03.2017, 01:46 | |
|
alkl, ага - почитайте ошибки
http://rextester.com/ITI45792 _q(18) http://rextester.com/KAGWC31525 _t(_q)
0
|
|
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
| 14.03.2017, 01:46 | |
|
1
|
|
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||
| 14.03.2017, 01:50 | ||
|
ct0r,
Но моё мнение, полный бред. Особенно, при good practice мы упираемся рогами в Foo{"Hello", 12}
0
|
||
|
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
|
||
| 14.03.2017, 01:56 [ТС] | ||
|
http://rextester.com/KXUTNA47635
0
|
||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
| 14.03.2017, 01:58 | |
|
0
|
|
| 14.03.2017, 01:58 | |
|
Помогаю со студенческими работами здесь
20
Инициализация полей класса через vector<> Инициализация вещественных статических константных полей класса С++
Ошибка при наследовании класса
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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 была полностью переписана на Си, в. . .
|