4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
1 | ||||||
Может ли объект-член, или объект-элемент достучаться к содержащему его?14.03.2014, 09:27. Показов 3454. Ответов 58
Метки нет (Все метки)
Предположим,
0
|
14.03.2014, 09:27 | |
Ответы с готовыми решениями:
58
Если объект константный, означает ли это, что ни один его член-элемент или член-метод не изменится? Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект Основы: указатель на объект или объект, что выбрать? Может ли функция иметь аргументом другую функцию или объект? |
18767 / 9779 / 2393
Регистрация: 30.01.2014
Сообщений: 17,164
|
|
15.03.2014, 14:35 | 41 |
rrrFer, какой-то ты странный. Сам советуешь ТС помещать указатели, а мой почти полностью эквивалентный вариант со ссылками называешь унылым. Предлагай лучше, никто не против.
У меня только один пример. Со ссылками. Ограничения в вызове виртуальных функцией есть. Нельзя вызывать в конструкторах и деструкторах. Так то же самое ограничение есть и в варианте с указателями. Я об этом уже писал.
И вообще, код с reinterpret_cast советовал не я, если ты не заметил. Добавлено через 7 минут Имеет оно решение. Нужно обеспечить вызовы конструкторов и деструкторов в хранимых объектах. А в них уже будут правильно согласовываться адреса. То есть твой класс Array должен это делать по типу как это делает std::vector. Ты не читал что ли вот этот пост?
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
15.03.2014, 14:37 [ТС] | 42 |
0
|
Jupiter
|
15.03.2014, 14:39
#43
|
0
|
18767 / 9779 / 2393
Регистрация: 30.01.2014
Сообщений: 17,164
|
|
15.03.2014, 14:44 | 44 |
taras atavin, Потому что не должно быть перемещения. Не имеешь ты право перемещать С++ объекты не POD-типа realloc`ом или memcpy. Ими ты можешь переместить только память, а объект должен уничтожится (вызов деструктора) в прежней области памяти, и создаться (вызов конструктора копии) в новой. Посмотри пример, который привел в том посте и проанализируй поведение при реаллокации.
Добавлено через 1 минуту Не по теме: Jupiter, не туда ты вбрасываешь. И не тому. То, что оно говно относительно других языков не играет роли, т.к. мы в С++ разделе. В С++ в принципе много чего не очень красиво относительно других языков.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
15.03.2014, 14:48 [ТС] | 45 |
Имею. А перемещение может быть неизбежно, например, если надо увеличить размер массива и новый размер не влазит от старого стартового адреса и до занятой (возможно такие же эрреем) памяти. А вот разрушение старых элементов, создание новых и перенос туда данных добавит проблем с UIDом, так что не имею я права как раз юзать деструкторы с конструкторами для объектов, существование которых продолжается.
0
|
Заблокирован
|
|
15.03.2014, 14:55 | 46 |
Значит ты не понял ТС. Или я не понял его. Или он сам не понял чего хочет.
ТС пишет про это: Код
class A { }; class B { int i; A m_a; } Потому что: Таких в плюсах нет. Но а кроме этого, ТС хочет чтобы с realloc все это работало. Т.е. у тебя где-то лежит указатель, и этот указатель ничего не знает о том что тарас вызвал realloc. А он вызвал. Указатель стал инвалидным, все пропало. Решения нет и оно не нужно. Нужно всякой ерундой не заниматься. Добавлено через 4 минуты Да ты че? - если надо увеличить размер массива можно: - использовать динамические списки; - использовать обертку над массивом, у которой адрес не меняется. Если какой-то realloc и выполняется - то он выполняется где-то там (в обертке), а все указатели на нее остаются валидными. Я вот непойму зачем все разрушать? - про указатели не читали?
1
|
18767 / 9779 / 2393
Регистрация: 30.01.2014
Сообщений: 17,164
|
|
15.03.2014, 14:56 | 47 |
Для С++ не-POD объектов - нет. По стандарту. С этим бесполезно спорить - это факт.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
15.03.2014, 15:00 [ТС] | 48 |
Ты ещё скажи, что по стандарту языка программирования запрещено делать, например, текстовый процессор с поддержкой бустрофедона.
0
|
18767 / 9779 / 2393
Регистрация: 30.01.2014
Сообщений: 17,164
|
|
15.03.2014, 15:05 | 49 |
Я вижу, что автор пишет аналог std::vector и хочет хранить внутри него объекты, в которых предусмотрена возможность обратной связи полей с родительским объектом. Ну так это можно сделать. Через обратную ссылку или указатель. Консистентность этой ссылки призваны сохранять конструкторы и деструкторы. В std::vector это прекрасно работает. А у автора не работает, потому что он не хочет играть по правилам. Ну в этом случае действительно решения нет.
Что еще за проблемы с UIDом? Поясни. Добавлено через 2 минуты taras atavin, дружище. У тебя позиция такая интересная. Ты читаешь что тебе пишут, или сразу рвешься ответ писать? При чем тут текстовый процессор?
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
15.03.2014, 15:09 [ТС] | 50 |
Ещё раз. Конструкторы и деструкторы решают только проблему начальной инициализации указателя parent, но не могут быть вызваны при перемещении родительского объекта. И не важно, reallocом я его перекинул, чем то другим. Я увеличиваю количество объектов, с которыми имеют связь их дочерние, но за блоком был, например, другой такой же в своём родительском объекте. Блок влезать перестаёт, его надо переместить. Но если родительские объекты имеют ещё и UID, то юзать для этого их конструкторы и деструкторы нельзя, так как в результате будет имитировано нарушение их самоидентичности. Надо именно переместить, не создавай новые объекты для переноса в них старых данных.
0
|
18767 / 9779 / 2393
Регистрация: 30.01.2014
Сообщений: 17,164
|
|
15.03.2014, 15:10 | 51 |
Правильно написал тебе rrrFer просто хранить надо указатели на объекты, а не сами объекты, жизнь которых продолжается и не будет этих проблем.
0
|
Заблокирован
|
|
15.03.2014, 15:11 | 53 |
Я скажу что ты очень много от своего компьютера хочешь. Стандарт тут не при чем. Тебе вроде бы очевидные вещи пишут. Компьютер сам не догадается чего ты там перемещаешь.
Я не знаю что он пишет. На вектор я намекал в посте #46, но я даже не догадываюсь зачем ТС выполняет realloc самого вектора, когда надо выполнить realloc лежащего в нем массива (ну это решит проблему, которую он в 45 посте описал, обосновывая свой realloc). Вобщем все это догадки, потому что ТС свои мысли сформулировать не может, терминология придумывает сам и нормальный пример так ни разу и не написал.
0
|
18767 / 9779 / 2393
Регистрация: 30.01.2014
Сообщений: 17,164
|
|
15.03.2014, 15:14 | 54 |
Не по теме: taras atavin, у тебя прям как у наших заказчиков, требования уточняются в режиме реального времени. И все они почему-то считают, что остальные должны были телепатически догадаться о том, что им нужно. Храни в своем Array указатели на объекты, тогда при реаллокации скопируются только указатели. И овцы целы и волки сыты.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
15.03.2014, 15:15 [ТС] | 55 |
0
|
18767 / 9779 / 2393
Регистрация: 30.01.2014
Сообщений: 17,164
|
|
15.03.2014, 15:26 | 57 |
Была у него тема про это. Там самописный контейнер, перераспределение памяти идет через realloc.
Текстовый процессор не относится, а то о чем я написал - относится. Я тебе ссылку из стандарта привел. В языке приняты правила для копирования, создания и уничтожения объектов. У всех объектов, у которых есть конструкторы, они должны вызываться при создании, при перемещении или копировании должны вызываться конструкторы перемещения или копирования соответственно. При уничтожении должны вызываться деструкторы. Как это так, это не осносится к языку?? У POD типов либо вообще нет конструкторов и деструкторов, либо они тривиальны (да, это термин из стандарта). Поэтому их можно перемещать или копировать через низкоуровневые средства. Что тебе в этом не понятно?
0
|
Заблокирован
|
|
15.03.2014, 15:26 | 58 |
предыдущие темы этого персонажа я, к счастью, не видел.
Идентичность двух объектов (не только в программировании) выражается в их одинаковых свойствах и поведении. Самоидентичность, очевидно - идентичность объекта самому себе. Нарушение самоидентичности должно выражаться в том, что объект не обладает собственными свойствами. Это коллапс. Вы как хотите, а я ставлю диагноз "нарушение самоидентичности головного мозга" и ухожу из темы.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
15.03.2014, 15:35 [ТС] | 59 |
Так в том то и дело, что все свойства остались, а поисковая функция "думает", что это уже другой объект.
0
|
15.03.2014, 15:35 | |
Помогаю со студенческими работами здесь
59
Реализовать двухсвязный список. Каждый элемент списка может содержать один объект Как достать объект-контейнер, а не его элемент при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! Объект osteram& или как его вывести в переменную ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |