4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||
Класс, знающий все свои экземпляры23.10.2014, 21:20. Показов 2300. Ответов 57
Метки нет Все метки)
(
Некий класс, пусть его зовут A. В разных частях программы валяются строки
0
|
|
23.10.2014, 21:20 | |
Ответы с готовыми решениями:
57
Класс, знающий все свои экземляры
Создать класс и его экземпляры
|
Вездепух
![]() ![]() 10420 / 5692 / 1550
Регистрация: 18.10.2014
Сообщений: 14,021
|
|
23.10.2014, 22:02 | 2 |
Двусвязный список экземпляров будет работать наиболее эффективно, если вы не против того, чтобы засунуть в каждый объект указатель на последующий и предыдущий. Статический указатель будет хранить начало списка.
А если такой вариант не устраивает, то регистрировать объекты придется во внешнем статическом контейнере. Но возникает вопрос - а как вы там будете искать объект для удаления? Если поиском, то возникает вопрос эффективности поиска. Вас устроит поиск при каждом удалении? А если без поиска, то придется опять же хранить внутри каждого объекта итератор на его положение в контейнере и использовать контейнер с "долгоживущими" итераторами ('std::list'?)
0
|
![]() 3219 / 1746 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
|
||||||
24.10.2014, 05:10 | 3 | |||||
0
|
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||
24.10.2014, 10:23 [ТС] | 4 | ||||||||||
Ничего не понял. Кто такой этот std::set и что за std::copy?
Добавлено через 4 минуты Всё как раз и затевается ради поиска, но не себя. Перебрать придётся всех, при этом порядок не имеет значения. Добавлено через 43 минуты Кстати, не подскажите, как правильно инициировать этот член значением NULL? Чтоб гарантировать, что пользовательский код не будет содержать
Добавлено через 2 часа 5 минут Покритикуйте:
0
|
Почетный модератор
![]() 5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,905
|
|
24.10.2014, 10:35 | 6 |
taras atavin, объектный пул.
0
|
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
24.10.2014, 10:56 [ТС] | 7 |
А по существу?
Добавлено через 3 минуты
0
|
Почетный модератор
![]() 5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,905
|
|
24.10.2014, 11:25 | 8 |
taras atavin, вот когда-то задавался подобным вопросом. Может пригодится.
0
|
Заблокирован
|
|
24.10.2014, 11:30 | 9 |
Для подобных целей в Windows используется COM (Component Object Model), для получения интерфейса - QueryInterface, для освобождения Release, там идёт подсчёт ссылок.
0
|
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
24.10.2014, 11:55 [ТС] | 10 |
Для каких таких "подобных" целей? Мне не нужен дебильный указатель со счётчиком ссылок. И вообще счётчик здесь не поможет, так как мне не надо держать объект, пока на него кто то ссылается. Задача другая. В частности удаляемый объект должен уметь при удалении сбрасывать в NULL все указатели на себя из членов своего класса, где бы они ни валялись. Время же жизни объекта как раз должно быть управляемо, а не как на джаве с решёткой в перемешку. Если объект больше не нужен, то это известно точно и он должен за собой подчистить, подтереть ранее заведённые связи. Столб, тот самый, который окопался, решили срубить, а он другим столбам сообщил и все провода, у которых по одному концу на нём висело, не упали, оставшись вторыми концами на других столбах, а исчезли. Или контейнер затевает перемещение объектов в связи с увеличением их количества и каждый перемещаемый объект должен указатели на себя исправить.
0
|
Заблокирован
|
|
24.10.2014, 12:05 | 12 |
Тогда наверное этот вариант будет правильней:
Если нужна какая - то логика в последовательности передачи сигналов об изменение, тогда тут нужны какие - то опять же статические связанные списки или же графы.
0
|
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
24.10.2014, 12:21 [ТС] | 13 |
Ещё раз. Это в любом случае класс узла графа. Но графов может быть и два, и десять, и сто, некоторые из них сложены в лес, другие валяются просто так. Одновременно часть экземпляров класса является просто одиночными объектами. А теперь задача №1: узел графа должен своём при перемещении на другой адрес в памяти исправить указатели, на которых реализованы входящие в него рёбра. И задача № 2: узел графа должен при своём удалении удалить и входящие в него рёбра, обнулив указатели, на которых они реализованы. Ну ка как предложите искать соседей произвольно заданного узла, к которым могут не вести исходящие из данного узла рёбра?
Добавлено через 4 минуты Данная фича должна быть гарантирована не для каждого контейнера пользовательского типа, а для вполне определённого контейнера, чей класс разработан в паре с классом элемента. Поэтому что именно контейнер юзает для перемещения своих элементов известно на этапе разработки их класса.
0
|
Заблокирован
|
|
24.10.2014, 12:27 | 14 |
В общем попробуй глянуть на гиперграф или на нейронную сеть. У тебя же есть группа классов, есть другая группа, независимых от первой классов, есть вообще группы из одного класса и тд, каждая группа объединяется в общую вершину гиперграфа или просто должна быть связанны с общим нейронном более высокого уровня, при удаление или изменение одного элемента группы, этот элемент шлёт сигнал общему для всех элементов этой группы нейрону (ребру гиперграфа, лучше используй термин - нейронная сеть, гиперграфы - в топку), этот нейрон просто рассылает всем своим детям информацию об изменение какого - то своего ребёнка )) То же самое можно проворачивать над целыми пучками групп и тд, то есть на любом уровне иерархии.
0
|
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
24.10.2014, 12:34 [ТС] | 15 |
Проблема в том, что пройти надо против рёбер, а не по рёбрам. Из заданного узла может вообще не выходить ни одного исходящего ребра, но он должен что то сделать с рёбрами, входящими в него. От того, что одно ребро сможет входить в три четыре узла сразу, ничего решится.
0
|
Заблокирован
|
|
24.10.2014, 12:54 | 16 |
Следовательно удалять или изменять такой элемент нужно не из самого элемента, а из других элементов, которые на него ссылаются, если конечно действительно ни какой рекуррентности не предусмотрено. То есть удаление элемента должно происходить из вершины / процессора, который имеет право что то делать со своими дочерниеми элементами, вот он то и должен удалять. А если речь идёт об самоудаление элемента, на которые что - то ссылается, а он никому об этом не может сказать - тогда тут скорее всего не правильная онтология построения модели, т.к. можно было бы в принципе пинговать элементы по рёбрам, типа если нет отклика - значит и элемента нет, но у тебя ж обратной связи вообще нет, так не должно быть, она должны быть в любом случае, пусть и не напрямую, а через огромное кольцо нейронной сети.
Вот ты знаешь, допустим человеку отрубили руку, у него остаются фантомные ощущения, что эта рука есть... со временем они пропадут, но только потому, что мозг будет слать кучу сигналов руке и не будет получать никакого отклика от этого и со временем сеть перестроить так, что эти связи отомрут, то есть исчезнут, т.к. они будут не нужными, а избыточность для живого организма не приемлема.
0
|
24.10.2014, 13:00 | 17 | |||||
Могу рассказать как подобные вещи сделаны в JVM (OpenJDK) - как известно там есть сборщик мусора (далее GC), который иногда запускается. Кроме очистки памяти он еще делает ее дефрагментацию (перемещает объекты). Представим ситуацию - в методе используется много ссылок на объекты, запускается GC, после его работы все ссылки становяться не валидными. Что делать? Первое, что приходит в голову - менять значения всех ссылок на новые (о чем и идет речь в этой теме). Но это, мягко говоря, гемморно. Поэтому в Hotspot'е (думаю и в других JVM так же) сделали так - завели сущность OOP (ordinary object pointer) - управляемый указатель. И Java код (интерпретатор и/или компилятор) работает только с OOP'ами. Что это такое - коротко говоря это оболочка над указателем, которая существует в системе в единственно экземпляре. Очень грубо можно представить его так
Можешь попробовать реализовать нечто подобное.
1
|
Заблокирован
|
|
24.10.2014, 13:12 | 18 |
0
|
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
24.10.2014, 13:19 [ТС] | 19 |
1. А откуда они об это знают? Они могут быть в другом дереве, в другой функции и вообще чёрт знает где.
2. Их может быть много. Из одного удаляем, а из ещё пары тысяч исходят рёбра, входящие в удаляемый узел. Что делать с ними?
0
|
24.10.2014, 13:22 | 20 |
При удалении объекта нужно будет сбросить в NULL только один указатель (в OOP'е), а не искать все указатели неизвестно где.
думаю имелось ввиду, что в Java нужно ждать когда запустится GC, судя по
0
|
24.10.2014, 13:22 | |
Помогаю со студенческими работами здесь
20
Требуется человек с опытом написания на этих языках, знающий все от и до Сериализовать класс, содержащий экземпляры других классов и листы с объектами типа object Вернуть все экземпляры класса Как перебрать все экземпляры класса? Удалить n элемент и все его экземпляры из списка
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |