Полиморфные объединенные свойства библиотеки графов Boost

StackOverflow https://stackoverflow.com/questions/8888798

Вопрос

Итак, я использую график ускорения следующего типа:

общий

VertexT и EdgeT - это классы, которые сохраняют многие из необходимых мне свойств.Это связанные свойства.Я не уверен, возможны ли некоторые из способов, которыми я хочу использовать bgl, поэтому, если вы знакомы с ними, помощь будет очень признательна.

Предполагается, что VertexT и EdgeT являются полиморфными базовыми классами.Насколько я понимаю, bgl не предназначен для использования в качестве указателей на эти свойства.Как работать с полиморфными свойствами вершин и ребер с помощью BGL?Я думал об использовании общих указателей, но я бы предпочел сам управлять памятью.Кроме того, похоже, что это предотвращает проблему при использовании boost :: get для создания карты положения для макетов ускорения.

Прямо сейчас я решил обойти это, просто имея вершину, содержащую еще один указатель на настоящий полиморфный класс.Но это кажется слишком сложным.Есть предложения?

Это было полезно?

Решение

В общих реализациях алгоритмов предпочтительно использовать семантику значений: копирование объекта приводит к существованию двух идентичных объектов, которые являются независимыми. Это важнейшее свойство, когда необходимо дублировать объекты. Динамический полиморфизм не сразу работает с семантикой значений, потому что для использования динамического полиморфизма вам нужно иметь дело с указателями или ссылкой: при использовании значений статический тип и динамический тип объекта совпадают, что не допускает динамический полиморфизм напрямую.

Единственный способ справиться с объектами динамического полиморфизма в этом случае - придать им привлекательный внешний вид. Фактически это означает, что вам нужно инкапсулировать указатели на ваши объекты в объект, который предоставляет интерфейс требуемого значения (вы также можете инкапсулировать ссылки, если вы настаиваете, но я никогда не обнаружил, что это работает хорошо). Библиотека Boost Graph на самом деле не заботится о том, как различные структуры представлены внутри, если они имеют требуемый интерфейс и реализуют требуемую семантику. Исходя из того, что вы описываете, использование оболочки для указателей на полиморфные объекты - правильный путь. Поддерживаете ли вы объект с помощью одного из стандартных интеллектуальных указателей или иным образом, на самом деле не имеет значения, хотя я предполагаю, что использование чего-то вроде boost::shared_ptr<T> или std::shared_ptr<T> устраняет ряд ненужных сложностей.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top