|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
Может ли объект-член, или объект-элемент достучаться к содержащему его?14.03.2014, 09:27. Показов 5455. Ответов 58
Метки нет (Все метки)
Предположим,
0
|
||||||
| 14.03.2014, 09:27 | |
|
Ответы с готовыми решениями:
58
Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект
|
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 14.03.2014, 17:34 [ТС] | |
|
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 14.03.2014, 17:43 | ||
|
taras atavin, обычный для указателей на члены класса. Это по сути как раз те самые смещения. Поэтому их получают через определение класса
А вот reinterpret_cast в этом случае - нехорошо. Пример не учитывает выравнивание, к тому же компилятор для не standard-layout классов может менять местами поля в целях оптимизации. Ну и достаточно просто добавить в такой класс еще одно поле и не провести соответствующих изменений в коде доступа к полям, то все смещения "поплывут".
0
|
||
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 14.03.2014, 17:45 [ТС] | |
|
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||||||||||||||||
| 14.03.2014, 18:04 | |||||||||||||||||||||
|
taras atavin,
Есть объект типа А. Назовем его obj. У него естественно есть адрес. Адрес есть и у каждого его поля. Указатель на это поле можно получить двумя способами. Первый способ - это получить указатель на объект поля.
Для доступа по этому смещению нам нужна база. Это базой может служить непосредственно объект типа А.
либо, можно использовать для этого указатель:
0
|
|||||||||||||||||||||
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 14.03.2014, 18:07 [ТС] | |
|
Нда. А кто мешает юзать имена полей и поручить смещения компилятору?
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 14.03.2014, 18:14 | |
|
taras atavin, никто. Просто иногда это бывает полезно.
Добавлено через 6 минут Лично я не находил применения таким указателям на данные. Но зато использовал указатели на методы (у них синтаксис похож, только параметры еще добавляются). Это полезно при реализации делегатов.
0
|
|
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||
| 14.03.2014, 18:23 [ТС] | |||||||
0
|
|||||||
|
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
|||||||||
| 14.03.2014, 20:18 | |||||||||
Но вряд ли можно полагаться на то, что он просто равен смещению. Зависимость может быть какой-то другой. (Вариант 1. Указатель на член класса равен смещению+1. Значение 0 зарезервируем для недействительного указателя.) (Вариант 2. Указатель на член класса равен смещению. Недействительный указатель: 0xFFFFFFFF.) (Другие варианты ... ) Так что, если использовать .* или ->* компилятор всё расшифрует правильно. А при использовании reinterpret_cast возникнет ошибка.
0
|
|||||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 14.03.2014, 23:29 | ||
0
|
||
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 15.03.2014, 07:37 [ТС] | |
|
Данный пример не учитывает, что однотипных членов может быть несколько.
0
|
|
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
| 15.03.2014, 07:48 [ТС] | ||||||
0
|
||||||
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 15.03.2014, 07:49 [ТС] | |
|
На скрине видно, что функция не знает, для какого именно члена вызвана на самом деле и не может определить адрес искомого объекта.
0
|
|
|
Заблокирован
|
|||
| 15.03.2014, 07:54 | |||
.Иначе никак не может DrOffset, Что там о виртуальных функциях в твоих примерах? Откуда дочерний объект уверен, что он является полем класса "А"? - в твоих примерах именно так. Т.е. поместить его в другой класс я не могу. Унылый вариант.
0
|
|||
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 15.03.2014, 07:57 [ТС] | ||
|
А ведь есть ещё такие пакости:
1. Класс A является типом членов одновременно нескольких других классов. 2. Класс A является типом элементов реализованных на указателях динамических массивов и индекс элемента членам самого класса A не известен. 3. Экземпляр A может быть и обычным объектом, а не частью другого объекта. Добавлено через 1 минуту
0
|
||
|
Заблокирован
|
|||||||
| 15.03.2014, 07:58 | |||||||
Я ж грю, код унылый и ни разу не в тему. Оно вернет нужный тебе адрес, если объект класса В является членом именно класса А, и только для поля a1 (да и именно с таким именем). ИМХО автор кода не знает куда приткнуть свои навыки говнокодинга, поэтому вот.. А по теме, я уже сказал. Помещай в дочерний класс указатель на родительский. Только так.
0
|
|||||||
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||
| 15.03.2014, 08:07 [ТС] | |||||||
|
Добавлено через 51 секунду Задача не решена. Добавлено через 5 минут И похоже не имеет на c++ качественного решения, которое бы не страдало возможностью порчи адреса агрегирующего объекта: можно завести член
0
|
|||||||
|
Заблокирован
|
||
| 15.03.2014, 08:13 | ||
0
|
||
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||||||||
| 15.03.2014, 10:02 [ТС] | |||||||||||||||||
0
|
|||||||||||||||||
|
Заблокирован
|
||||
| 15.03.2014, 11:29 | ||||
|
taras atavin, "код целиком" - это не тоже самое, что кучу лишнего кода (который вообще не в тему, кстати).
Это значит, что я жду пример, который будет компилироваться
Именно такой пример, в котором у тебя "адрес портится". Формулируй мысли нормально с общепринятой терминологией, иначе никто не ответит.
0
|
||||
|
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 15.03.2014, 11:37 [ТС] | |
|
0
|
|
| 15.03.2014, 11:37 | |
|
Реализовать двухсвязный список. Каждый элемент списка может содержать один объект
при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! Объект osteram& или как его вывести в переменную ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|