Традиционной альтернативой является использование vector
указателей, как уже отмечалось.
Для тех, кто ценит, Boost
поставляется с очень интересной библиотекой: Pointer Containers
, которая идеально подходит для этой задачи и освобождает вас от различных проблем, связанных с указателями:
- управление жизненным циклом
- двойная разыменование итераторов
Обратите внимание, что это значительно лучше, чем vector
интеллектуальных указателей, как с точки зрения производительности, так и интерфейса.
Теперь есть третья альтернатива, которая заключается в изменении вашей иерархии. Для лучшей изоляции пользователя я несколько раз видел следующую схему:
class IClass;
class MyClass
{
public:
typedef enum { Var1, Var2 } Type;
explicit MyClass(Type type);
int foo();
int bar();
private:
IClass* m_impl;
};
struct IClass
{
virtual ~IClass();
virtual int foo();
virtual int bar();
};
class MyClass1: public IClass { .. };
class MyClass2: public IClass { .. };
Это довольно просто, и вариант идиомы Pimpl
обогащен шаблоном Strategy
.
Это работает, конечно, только в том случае, если вы не хотите напрямую манипулировать «истинными» объектами, и требует глубокого копирования. Так что это может быть не то, что вы хотите.