Хранение объектов в векторе - PullRequest
1 голос
/ 05 сентября 2010

Можно ли иметь вектор, не специализируя его?

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

Ответы [ 2 ]

5 голосов
/ 05 сентября 2010

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

EXTRA На самом деле, указатели являются единственным способом, даже если класс не является рефератом, но подклассами и дочерние классы предназначены для использования в векторе. Почему: std :: vector распределяет байты sizeof (T) для каждого элемента, но sizeof (производныйFromT) может быть больше sizeof (T). Вы сможете вставить дочерний объект в вектор, но это может вызвать непредсказуемые проблемы во время выполнения.

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

1 голос
/ 05 сентября 2010

Что вам нужно, это std::vector< std::shared_ptr<N4GestureRecognizer> >.

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

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

...