Я работаю на кроссплатформенном С++, и некоторые классы определены так: (сильно упрощено для этого примера)
class ExampleBase
{
public:
ExampleBase( int blah ) : blah_test(blah) { }
virtual void DoSomething( ) = 0;
private:
int blah_test;
};
class ExampleImplementer : public ExampleBase
{
public:
ExampleImplementer( ) : ExampleBase( 5 ) { }
virtual void DoSomething( ) { /* unique implementation here */ }
};
Первоначально у меня был только один класс, несколько экземпляров которого я сохранил в std::vector и передал по ссылке const. Но теперь мне нужен базовый класс (который я хочу сохранить чисто виртуальным) и ряд полиморфных классов реализации.
Каков наилучший способ иметь коллекцию любых экземпляров реализации и при этом иметь простое управление памятью без утечек, например выделение стека std::vector?
Очевидно, у меня не может быть std::vector‹ ExampleBase > сейчас, поскольку std::vector требует, чтобы класс был не чисто виртуальным (поскольку он выполняет внутреннее размещение/копирование и т. д.). Я не хочу, чтобы пользователи моего кода случайно создавали экземпляры ExampleBase, потому что это неправильно. Я также хочу держаться подальше от любых возможностей нарезки объектов или любых других гадостей.
Массив
std::auto_ptr
выполнит эту работу, но тогда мне придется иметь дело с их инициализацией, поиском «свободного слота», отсутствием итераторов и т. д. Кажется немного безумным заново изобретать все это колесо.boost::ptr_vector
выглядел многообещающе, однако он ведет себя немного странно, поскольку при сборке в Linux ему требуется, чтобы ExampleBase не был чисто виртуальным - и я не понимаю, почему... Итак,boost::ptr_vector
отсутствует.
Это кажется простой и, вероятно, действительно распространенной ситуацией. Итак, как лучше всего это сделать? Я открыт для любого другого стандартного или ускоренного способа сделать это: в зависимости от того, что «лучше».
ptr_vector
. Это определенно не должно требовать, чтобы базовый класс был неабстрактным - что-то еще не так. - person Pavel Minaev   schedule 26.09.2009