Отслеживание ссылок

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

18 фев 2009, 10:43

&quot писал(а):Что такое фабрика
Это шаблон проектирования, по сути класс, который позволяет спрятать от программиста непосредственный вызов new и вернуть указатель на интерфейс вновь созданного объекта. Шаблон проектирования позволяет решить несколько проблем.

- Правильное выбранное имя фабричного метода самодокументирует код, в то время, как вызов оператора с кучей переменных часто может быть не прозрачен.

- Вызывающий код не знает о том, объект какого именно класса будет создан, его интересует только то, какой интерфейс этот объект имплементирует, таким образом уменьшается количество связей в проекте.

- Имплементация может быть подменена в любой момент, при этом вызывающий код не только не измениться, но даже не потребует перекомпиляции.

- Создающие методы фабрики могут выполнять какие-то дополнительные функции, которые пришлось бы дублировать во всех местах непосредственного создания объекта, если бы фабрика не использовалась.

- Расширение шаблона проектирования до абстрактной фабрики позволяет решить ещё одну проблему: создание объектов сложных иерархий и незаметная для пользователя подмена имлементаций целых иерархий или отдельных их частей.
&quot писал(а):...и рефкаунтинг?
В двух словах о рефкаунтинге я уже сказал выше, читай внимательней. Суть рефкаунтинга вот в этом предложении:
&quot писал(а):...сделать легковесный темплейт враппер, который хранит указатель на структурку, в которой содежится указатель и счётчик ссылок на этот указатель. В конструкторе счётчик++, в деструкторе счётчик-- и если счётчик == 0 то delete указатель.
&quot писал(а):Где взять серьёзну книгу с текстом и примерами на эту тему?
Design Patterns: Elements of Reusable Object-Oriented Software

Погугли, книга достаточно популярна, и найти её в интернете в электронном виде не составляет проблемы. Советую именно англоязычный вариант, ибо русский перевод содержит некоторые неточности, хотя они и не критичны.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

18 фев 2009, 10:55

Спасибо. Только у меня задача не совсем такая. Создающий объект не только знает, объект какого класса он созаёт, но и не может создать вместо него объект другого класса. Это обязательное условие. Можно ли придать фабрике подобные свойства? И что делать с поиском ссылок. Без подсчёта числа ссылок на каждый объет я могу обойтись, а вот поиск нужен обязательно. Кроме того, счётчик ссылок не отличает циклических ссылок от обычных, а мне надо циклические не засчивать, но только в том случае, если вся петля ссылок связвает объекты только одного класса, являющиеся элементами динамичесикх массивов одного типа. Коме того, у меня явно разделено сооздание объекта и содание ссылки. В отличие от рефкаунтинге при попытке повтороного создания уже сущетсвующего объекта должна быть действительно создана его копия. Но в тех случаях, когда создаётся ссылка, она потом должна исправляться при изменении фактического адреса, а сам объект должен быть удалён по специальному запросу в том случае, если нет ссылок на этот объект. Обрати внимание на то различие по специальному запросу при отсутвии сылок, а не в момент удаления последней ссылки. Как это реализовать? Причём, объек, создающий ссылку тоже занет, ссылку на объект какого класса он создаёт и не может вместо неё создать ссылку на объект другого класса.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

18 фев 2009, 13:01

Ты спросил что такое фабрика - я рассказал. То, что она не подходит для тебя, об этом я уже говорил выше.

Можно поступить так. Сделай некий менеджер. Менеджер будет держать все ссылки и удалять их либо в деструкторе (когда программа завершается), либо по специальному вызову. Он же будет обеспечивать поиск циклов, например методом "волны" или любым другим (для этого тебе придётся вспомнить теорию графов).

Метод волны заключаются в том что, в ориентированном графе, в котором все вершины пронумерованы, некая вершина (назовём её начальной) помечается маркером. Маркер - число. Вершина помечается номером самой себя.

1. Пробежаться по всем вершинам графа. Если некая вершина (назовём её текущей) помечена, то проверить все её соседние вершины (это те, в которые направлены дуги графа, исходящие из текущей вершины).

1.а. Если некая соседняя вершина не помечена, то пометить её маркером с номером текущей вершины.

1.б. Если некая соседняя вершина уже помечена маркером, значит наш граф содержит цикл. Перейти на пункт 4.

2. Если хоть одна вершина за проход итерации была помечена, то выполнить пункт 1 ещё раз.

3. Если мы достигли этого пункта, то граф не содержит циклов.

4. Конец алгоритма.

Теперь, чтобы найти список всех вершин в найденном цикле следует идти задом наперёд. Предварительно нужно запомнить номер вершины, которую мы не смогли пометить (назовём ее А) и двигаться от текущей вершины (у которой А является соседней), каждый раз переходя в предыдущую вершину, используя маркер на текущей. Остановиться следует, как только достигнем вершины А (а достигнем мы её гарантированно). Пройденный путь является искомым циклом.

Метод назван волновым, так как если рассматривать анимированную картинку итераций (либо просто её представить), то мы увидим, что от начальной вершины во все стороны распространяется волна маркеров, причём она либо схлестнётся в какой-то вершине (в этом случае в графе будет обнаружен цикл), либо пройдётся по всем вершинам не схлестнувшись.

Кстати, похожий алгоритм позволяет определить является граф связным. Достаточно не выходить в пункте 1.б. и после завершения цикла проверить все ли вершины маркированы. Если не все, то граф не связный. Выбирая первую непомеченную вершину в качестве начальной, и запуская алгоритм вновь, можно даже определить степень связности графа.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

18 фев 2009, 13:06

&quot писал(а): (для этого тебе придётся вспомнить теорию графов.
Мой ответ мне самому кажется странным, но я умудрился теорию графов вообще не изучить. Где можно найти по ней инфу?
&quot писал(а):Ты спросил что такое фабрика - я рассказал. То, что она не подходит для тебя, об этом я уже говорил выше.
А что подходит? И где искать инфу?
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

18 фев 2009, 13:11

&quot писал(а):Мой ответ мне самому кажется странным, но я умудрился теорию графов вообще не изучить. Где можно найти по ней инфу?
Любой учебник по теории графов. На самом деле, если ты прочтёшь то, что я написал выше, учебник тебе даже не понадобится. Вся инфа в моём посте.
&quot писал(а):А что подходит? И где искать инфу?
Ещё раз тебе говорю, внимательно прочти моё предыдущее сообщение. Там написано, как тебе можно поступить.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

18 фев 2009, 13:15

&quot писал(а):Любой учебник по теории графов. На самом деле, если ты прочтёшь то, что я написал выше, учебник тебе даже не понадобится. Вся инфа в моём посте.
Всё-таки давай конкретную ссылку именно на учебник. Надо для другого проекта.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

18 фев 2009, 13:18

Я не знаю конкретной ссылки на учебник. Погугли - этого добра в интернете более, чем достаточно.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

18 фев 2009, 13:19

&quot писал(а):Ещё раз тебе говорю, внимательно прочти моё предыдущее сообщение. Там написано, как тебе можно поступить.
У меня как у Жиглова глаз замылился. Не понимаю, как этот алгоритм применить для поиска указателей на себя в ситуации, когда метод не знает всех идентификаторов, от которых следует искать.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

18 фев 2009, 13:27

Ну можно обязать все классы выставлять метод, который будет возвращать указатели на все объекты, на которые ссылается данный объект. В этом случае объекты и ссылки между ними как раз и образуют граф. Другой вопрос это то, что реализация не самой простой получается. Но ведь и хочешь ты не совсем тривиальных вещей добиться.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

18 фев 2009, 13:33

Есть ориентированный граф. Он может быть как связным, так и не связным. Возможен и частный случай дерева. Но граф может и не имть как дерево единого корня. Кроме того, он может иметь циклы. Ребра хранятся в виде указтелей. Надо реализовать сбор мусора и при изменении физических адресов вершин графа исправление всех указателей. В такой постановке можешь подсказать, как всё это пишется? И ссылку я просил не сетевую, а название, автора, издательство. Или хотя-бы только автора и название. gogle здесь как поможет?
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответить