Возможно ли иметь вектор без его специализации?

Моя проблема: у меня есть абстрактный класс N4GestureRecognizer и пара его подклассов. Итак, в классе контроллера я хочу иметь vector<N4GestureRecognizer> recognizers_, но, поскольку он абстрактный, я не могу. Как я могу сохранить эти распознаватели в векторе, коллекции или списке или что-то еще, что поддерживает цикл в стандартном c ++?

1
nacho4d 5 Сен 2010 в 15:21

2 ответа

Лучший ответ

Сохраните их как указатели. Либо чистые указатели, либо какой-то класс умных указателей.

ДОПОЛНИТЕЛЬНАЯ Фактически, указатели - единственный способ, даже если класс не является абстрактным, а является подклассом, а дочерние классы предназначены для использования в векторе. Почему: std :: vector выделяет байты sizeof (T) для каждого элемента, но sizeof (производноеFromT) может быть больше sizeof (T). Вы сможете вставить дочерний объект в вектор, но это может вызвать непредсказуемые проблемы во время выполнения.

Конечно, управлять векторами указателей сложно, но, насколько я помню, boost содержит несколько умных указателей для упрощения задачи.

5
Gobra 5 Сен 2010 в 15:31
Боюсь, это единственный выход.
 – 
Gobra
5 Сен 2010 в 15:28
2
И в наши дни в стандарте есть умные указатели: std :: tr1 :: shared_ptr <>
 – 
Just another metaprogrammer
5 Сен 2010 в 15:42
2
Результат помещения производных классов в такой вектор во время выполнения не является «непредсказуемым». Это называется нарезкой, и это вполне предсказуемо (хотя может и неожиданно для новичка).
 – 
SoapBox
5 Сен 2010 в 16:07
1
Сама нарезка предсказуема :) Я имею в виду, что выполнение приложения не будет предсказуемо.
 – 
Gobra
5 Сен 2010 в 16:11
Позвольте мне указать: boost.org/doc/libs / 1_44_0 / libs / ptr_container / doc /…
 – 
sellibitze
5 Сен 2010 в 19:43

Вам нужен std::vector< std::shared_ptr<N4GestureRecognizer> >.

Если ваша std lib поставляется без std::shared_ptr (он является частью следующего стандарта C ++, который, как ожидается, будет опубликован в следующем году), он может поставляться с std::tr1::shared_ptr, который является таким же (как дополнение к текущему стандарту C ++ стандарт официальным Техническим отчетом 1 ). Если и это не удается, всегда есть boost, у которого есть boost:shared_ptr (который является предшественником std::tr1::shared_ptr и std::shared_ptr).

Примечание. Не используйте голые указатели (std::vector<N4GestureRecognizer*>). Практически невозможно сделать это безопасным, чтобы не протекать.

1
sbi 5 Сен 2010 в 15:41
Хотя, если вы можете использовать ускорение, ptr_vector часто оказывается лучшим решением, чем std::vector из shared_ptr.
 – 
CB Bailey
5 Сен 2010 в 15:47