Возможно ли иметь вектор без его специализации?
Моя проблема: у меня есть абстрактный класс N4GestureRecognizer и пара его подклассов. Итак, в классе контроллера я хочу иметь vector<N4GestureRecognizer> recognizers_
, но, поскольку он абстрактный, я не могу. Как я могу сохранить эти распознаватели в векторе, коллекции или списке или что-то еще, что поддерживает цикл в стандартном c ++?
2 ответа
Сохраните их как указатели. Либо чистые указатели, либо какой-то класс умных указателей.
ДОПОЛНИТЕЛЬНАЯ Фактически, указатели - единственный способ, даже если класс не является абстрактным, а является подклассом, а дочерние классы предназначены для использования в векторе. Почему: std :: vector выделяет байты sizeof (T) для каждого элемента, но sizeof (производноеFromT) может быть больше sizeof (T). Вы сможете вставить дочерний объект в вектор, но это может вызвать непредсказуемые проблемы во время выполнения.
Конечно, управлять векторами указателей сложно, но, насколько я помню, boost содержит несколько умных указателей для упрощения задачи.
Вам нужен 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*>
). Практически невозможно сделать это безопасным, чтобы не протекать.
ptr_vector
часто оказывается лучшим решением, чем std::vector
из shared_ptr
.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.