Форум программистов, компьютерный форум CyberForum.ru

Может ли объект-член, или объект-элемент достучаться к содержащему его? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2014, 09:27     Может ли объект-член, или объект-элемент достучаться к содержащему его? #1
Предположим,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
{
 ...
};
class B
{
 ....
 A a;
...
};
class C
{
 ...
 A *a;
 ...
}
...
B b1;
B *b2;
C c;
size_t i;
...
. Может ли b1.a достучаться до b1, b2[i].a к b2[i], а c.a[i] - до c? Данные по c.a и b2 могут перемещаться reallocом.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2014, 09:27     Может ли объект-член, или объект-элемент достучаться к содержащему его?
Посмотрите здесь:

C++ [C++]Один объект не может дополнить другой.
при вызове конструктора присваивания надо возвращать ссыль на объект или сам объект. Смысл? Значения нужных полей меняютмся и без этого! C++
Объект osteram& или как его вывести в переменную ? C++
Реализовать двухсвязный список. Каждый элемент списка может содержать один объект C++
интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
15.03.2014, 14:35     Может ли объект-член, или объект-элемент достучаться к содержащему его? #41
rrrFer, какой-то ты странный. Сам советуешь ТС помещать указатели, а мой почти полностью эквивалентный вариант со ссылками называешь унылым. Предлагай лучше, никто не против.
Цитата Сообщение от rrrFer Посмотреть сообщение
Что там о виртуальных функциях в твоих примерах?
У меня только один пример. Со ссылками. Ограничения в вызове виртуальных функцией есть. Нельзя вызывать в конструкторах и деструкторах. Так то же самое ограничение есть и в варианте с указателями. Я об этом уже писал.

И вообще, код с reinterpret_cast советовал не я, если ты не заметил.

Добавлено через 7 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
И похоже не имеет на c++ качественного решения, которое бы не страдало возможностью порчи адреса агрегирующего объекта
Имеет оно решение. Нужно обеспечить вызовы конструкторов и деструкторов в хранимых объектах. А в них уже будут правильно согласовываться адреса. То есть твой класс Array должен это делать по типу как это делает std::vector. Ты не читал что ли вот этот пост?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.03.2014, 14:37  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #42
Цитата Сообщение от DrOffset Посмотреть сообщение
Имеет оно решение. Нужно обеспечить вызовы конструкторов и деструкторов в хранимых объектах. А в них уже будут правильно согласовываться адреса.
Конструктор дочернего объекта не решает проблему перемещения reallocом.
Jupiter
15.03.2014, 14:39
  #43

Не по теме:

вброс:

Цитата Сообщение от DrOffset Посмотреть сообщение
Имеет оно решение
говно все ваши решения. с++ не джава и такого элегантного решения как иннер классы - в с++ нет и не будет

DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
15.03.2014, 14:44     Может ли объект-член, или объект-элемент достучаться к содержащему его? #44
taras atavin, Потому что не должно быть перемещения. Не имеешь ты право перемещать С++ объекты не POD-типа realloc`ом или memcpy. Ими ты можешь переместить только память, а объект должен уничтожится (вызов деструктора) в прежней области памяти, и создаться (вызов конструктора копии) в новой. Посмотри пример, который привел в том посте и проанализируй поведение при реаллокации.

Добавлено через 1 минуту

Не по теме:

Jupiter, не туда ты вбрасываешь. И не тому. То, что оно говно относительно других языков не играет роли, т.к. мы в С++ разделе. В С++ в принципе много чего не очень красиво относительно других языков.

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.03.2014, 14:48  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #45
Цитата Сообщение от DrOffset Посмотреть сообщение
Потому что не должно быть перемещения. Не имеешь ты право перемещать С++ объекты не POD-типа realloc`ом или memcpy.
Имею. А перемещение может быть неизбежно, например, если надо увеличить размер массива и новый размер не влазит от старого стартового адреса и до занятой (возможно такие же эрреем) памяти. А вот разрушение старых элементов, создание новых и перенос туда данных добавит проблем с UIDом, так что не имею я права как раз юзать деструкторы с конструкторами для объектов, существование которых продолжается.
rrrFer
Заблокирован
15.03.2014, 14:55     Может ли объект-член, или объект-элемент достучаться к содержащему его? #46
Цитата Сообщение от DrOffset Посмотреть сообщение
Имеет оно решение.
Значит ты не понял ТС. Или я не понял его. Или он сам не понял чего хочет.

ТС пишет про это:
Код
class A {
};
class B { 
  int i;
  A m_a;
}
И вот это вот поле, m_a должно как-то изловчиться, найти объект в который оно вложено и заиметь доступ к его полям (например полю i). Т.е. насколько я понял, ТС ищет универсальную штуку, чтобы это работало вне зависимости от того, в какой класс вложено m_a; Ну грубо говоря.
Потому что:
Цитата Сообщение от taras atavin Посмотреть сообщение
Здесь нужны встроенные языковые средства,
Таких в плюсах нет.

Но а кроме этого, ТС хочет чтобы с realloc все это работало. Т.е. у тебя где-то лежит указатель, и этот указатель ничего не знает о том что тарас вызвал realloc. А он вызвал. Указатель стал инвалидным, все пропало.

Решения нет и оно не нужно. Нужно всякой ерундой не заниматься.

Добавлено через 4 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
Имею. А перемещение может быть неизбежно, например, если надо увеличить размер массива и новый размер не влазит от старого стартового адреса и до занятой (возможно такие же эрреем) памяти.
Да ты че? - если надо увеличить размер массива можно:
- использовать динамические списки;
- использовать обертку над массивом, у которой адрес не меняется. Если какой-то realloc и выполняется - то он выполняется где-то там (в обертке), а все указатели на нее остаются валидными.

Цитата Сообщение от taras atavin Посмотреть сообщение
А вот разрушение старых элементов, создание новых и перенос туда данных добавит проблем с UIDом, так что не имею я права как раз юзать деструкторы с конструкторами для объектов, существование которых продолжается.
Я вот непойму зачем все разрушать? - про указатели не читали?
DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
15.03.2014, 14:56     Может ли объект-член, или объект-элемент достучаться к содержащему его? #47
Цитата Сообщение от taras atavin Посмотреть сообщение
Имею.
Для С++ не-POD объектов - нет. По стандарту. С этим бесполезно спорить - это факт.
A class object can be copied in two ways, by initialization (12.1, 8.5), including for function argument passing (5.2.2) and for function value return (6.6.3), and by assignment (5.17). Conceptually, these two operations are implemented by a copy constructor (12.1) and copy assignment operator (13.5.3).
Для объектов POD ты можешь это делать. Но в таком случае у нас нет автоматического способа держать адреса внутри объекта в валидном состоянии (т.к. нет конструкторов и деструкторов). То есть что примеры что с указателями, что со ссылками работать не будут.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.03.2014, 15:00  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #48
Цитата Сообщение от DrOffset Посмотреть сообщение
Для С++ не-POD объектов - нет. По стандарту. С этим бесполезно спорить.
Ты ещё скажи, что по стандарту языка программирования запрещено делать, например, текстовый процессор с поддержкой бустрофедона.
DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
15.03.2014, 15:05     Может ли объект-член, или объект-элемент достучаться к содержащему его? #49
Цитата Сообщение от rrrFer Посмотреть сообщение
Значит ты не понял ТС
Я вижу, что автор пишет аналог std::vector и хочет хранить внутри него объекты, в которых предусмотрена возможность обратной связи полей с родительским объектом. Ну так это можно сделать. Через обратную ссылку или указатель. Консистентность этой ссылки призваны сохранять конструкторы и деструкторы. В std::vector это прекрасно работает. А у автора не работает, потому что он не хочет играть по правилам. Ну в этом случае действительно решения нет.
Цитата Сообщение от rrrFer Посмотреть сообщение
добавит проблем с UIDом
Что еще за проблемы с UIDом? Поясни.

Добавлено через 2 минуты
taras atavin, дружище. У тебя позиция такая интересная. Ты читаешь что тебе пишут, или сразу рвешься ответ писать? При чем тут текстовый процессор?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.03.2014, 15:09  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #50
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну так это можно сделать. Через обратную ссылку или указатель. Консистентность этой ссылки призваны сохранять конструкторы и деструкторы.
Ещё раз. Конструкторы и деструкторы решают только проблему начальной инициализации указателя parent, но не могут быть вызваны при перемещении родительского объекта. И не важно, reallocом я его перекинул, чем то другим. Я увеличиваю количество объектов, с которыми имеют связь их дочерние, но за блоком был, например, другой такой же в своём родительском объекте. Блок влезать перестаёт, его надо переместить. Но если родительские объекты имеют ещё и UID, то юзать для этого их конструкторы и деструкторы нельзя, так как в результате будет имитировано нарушение их самоидентичности. Надо именно переместить, не создавай новые объекты для переноса в них старых данных.
DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
15.03.2014, 15:10     Может ли объект-член, или объект-элемент достучаться к содержащему его? #51
Цитата Сообщение от taras atavin Посмотреть сообщение
деструкторы с конструкторами для объектов, существование которых продолжается
Правильно написал тебе rrrFer просто хранить надо указатели на объекты, а не сами объекты, жизнь которых продолжается и не будет этих проблем.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.03.2014, 15:11  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #52
Цитата Сообщение от DrOffset Посмотреть сообщение
Что еще за проблемы с UIDом? Поясни.
Читай здесь.
rrrFer
Заблокирован
15.03.2014, 15:11     Может ли объект-член, или объект-элемент достучаться к содержащему его? #53
Цитата Сообщение от taras atavin Посмотреть сообщение
Ты ещё скажи, что по стандарту языка программирования запрещено делать, например, текстовый процессор с поддержкой бустрофедона.
Я скажу что ты очень много от своего компьютера хочешь. Стандарт тут не при чем. Тебе вроде бы очевидные вещи пишут. Компьютер сам не догадается чего ты там перемещаешь.

Цитата Сообщение от DrOffset Посмотреть сообщение
Я вижу, что автор пишет аналог std::vector и хочет хранить внутри него объекты, в которых предусмотрена возможность обратной связи полей с родительским объектом.
Я не знаю что он пишет. На вектор я намекал в посте #46, но я даже не догадываюсь зачем ТС выполняет realloc самого вектора, когда надо выполнить realloc лежащего в нем массива (ну это решит проблему, которую он в 45 посте описал, обосновывая свой realloc).
Вобщем все это догадки, потому что ТС свои мысли сформулировать не может, терминология придумывает сам и нормальный пример так ни разу и не написал.
DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
15.03.2014, 15:14     Может ли объект-член, или объект-элемент достучаться к содержащему его? #54

Не по теме:

taras atavin, у тебя прям как у наших заказчиков, требования уточняются в режиме реального времени. И все они почему-то считают, что остальные должны были телепатически догадаться о том, что им нужно.


Храни в своем Array указатели на объекты, тогда при реаллокации скопируются только указатели. И овцы целы и волки сыты.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.03.2014, 15:15  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #55
Цитата Сообщение от DrOffset Посмотреть сообщение
дружище. У тебя позиция такая интересная. Ты читаешь что тебе пишут, или сразу рвешься ответ писать? При чем тут текстовый процессор?
При том, что он тоже не относится к языку программирования.
rrrFer
Заблокирован
15.03.2014, 15:16     Может ли объект-член, или объект-элемент достучаться к содержащему его? #56
Цитата Сообщение от taras atavin Посмотреть сообщение
имитировано нарушение их самоидентичности
переведи на рабоче-крестьянский?
Плох тот учёный, который не может объяснить суть своей теории пятилетнему ребёнку доступными для него словами
Чья-то цитата. Но я бы добавил, что не ученый тоже плох. Тебя тут никто понять не может.
DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
15.03.2014, 15:26     Может ли объект-член, или объект-элемент достучаться к содержащему его? #57
Цитата Сообщение от rrrFer Посмотреть сообщение
Я не знаю что он пишет. На вектор я намекал в посте #46, но я даже не догадываюсь зачем ТС выполняет realloc самого вектора
Была у него тема про это. Там самописный контейнер, перераспределение памяти идет через realloc.

Цитата Сообщение от taras atavin Посмотреть сообщение
При том, что он тоже не относится к языку программирования.
Текстовый процессор не относится, а то о чем я написал - относится. Я тебе ссылку из стандарта привел. В языке приняты правила для копирования, создания и уничтожения объектов. У всех объектов, у которых есть конструкторы, они должны вызываться при создании, при перемещении или копировании должны вызываться конструкторы перемещения или копирования соответственно. При уничтожении должны вызываться деструкторы. Как это так, это не осносится к языку??
У POD типов либо вообще нет конструкторов и деструкторов, либо они тривиальны (да, это термин из стандарта). Поэтому их можно перемещать или копировать через низкоуровневые средства. Что тебе в этом не понятно?
rrrFer
Заблокирован
15.03.2014, 15:26     Может ли объект-член, или объект-элемент достучаться к содержащему его? #58
Цитата Сообщение от DrOffset Посмотреть сообщение
Была у него тема про это. Там самописный контейнер, перераспределение памяти идет через realloc.
предыдущие темы этого персонажа я, к счастью, не видел.

Цитата Сообщение от taras atavin Посмотреть сообщение
имитировано нарушение их самоидентичности
Идентичность двух объектов (не только в программировании) выражается в их одинаковых свойствах и поведении.
Самоидентичность, очевидно - идентичность объекта самому себе.
Нарушение самоидентичности должно выражаться в том, что объект не обладает собственными свойствами.
Это коллапс.

Вы как хотите, а я ставлю диагноз "нарушение самоидентичности головного мозга" и ухожу из темы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2014, 15:35     Может ли объект-член, или объект-элемент достучаться к содержащему его?
Еще ссылки по теме:

компилятор считает объект l-value, но объект таковым не является C++
C++ Как достать объект-контейнер, а не его элемент
Если объект константный, означает ли это, что ни один его член-элемент или член-метод не изменится? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.03.2014, 15:35  [ТС]     Может ли объект-член, или объект-элемент достучаться к содержащему его? #59
Цитата Сообщение от rrrFer Посмотреть сообщение
Нарушение самоидентичности должно выражаться в том, что объект не обладает собственными свойствами.
Так в том то и дело, что все свойства остались, а поисковая функция "думает", что это уже другой объект.
Yandex
Объявления
15.03.2014, 15:35     Может ли объект-член, или объект-элемент достучаться к содержащему его?
Ответ Создать тему
Опции темы

Текущее время: 01:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru