Модель данных, универсальные контейнеры, C ++ - PullRequest
1 голос
/ 07 мая 2011

Я пишу новый контейнер как расширение общих контейнеров STL, хранящихся в AContainer (абстрактный класс).Для этого контейнера я хочу добавить новые функции в зависимости от хранимых объектов (геометрических объектов, таких как точки, линии, ...) ...

Но проблема немного сложнее.Например ... Существует несколько типов точек (2D, 3D ...), большинство свойств одинаковы ... Какая модель данных больше подходит:

1) Универсальный контейнер

Вывод нового класса Container из абстрактного класса AContainer, общего для каждого типа объектов.

AContainer -> Container

Выполнение частичной специализации для других геомерных объектов

Container <Point>
Container <Edge>
Container <Polygons>

и реализация их поведения внутри этих объектов.классы.

Но эта модель вызывает проблемы с описанием одного и того же поведения точек разных типов.Я должен специализировать Контейнер для Point2D, point3D

Container <Point2D>
Container <Point3D>

и в обеих специализациях написать их поведение, поэтому будет скопировано много кода.

В C ++, по моему мнению, невозможно выполнить частичную специализацию для класса и всех производных классов.

2) Специальный контейнер для каждого типа объекта

Производнаяновые классы для каждого типа объекта

AContainer ->ContainerPoints
           ->ContsinerEdges
           ->ContainerFaces

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

ContainerPoints

без необходимости какой-либо специализации ...

Боюсь слишком большой фрагментациикода (слишком много похожих классов) ... И, например, std :: vector универсален для каждого хранимого типа ...

Лучше ли для каждого геометрического типа создать новый класс или сделатьчастичная специализация?

Спасибо за помощь ...

1 Ответ

0 голосов
/ 07 мая 2011

Как насчет этого:

  template<class T>
  class Container { ... };
  class PointContainer : public Container<Point> { };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...