Традиционная альтернатива - использовать vector
указателей, как уже отмечалось.
Для тех, кто ценит, Boost
поставляется с очень интересной библиотекой: Pointer Containers
, которая отлично подходит для задание и освобождает вас от различных проблем, связанных с указателями:
Обратите внимание, что это значительно лучше, чем vector
интеллектуальных указателей, как с точки зрения производительности, так и интерфейса.
Теперь существует 3-я альтернатива, которая заключается в изменении вашей иерархии. Для лучшей изоляции пользователя я несколько раз использовал следующий шаблон:
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
.
Это работает, конечно, только в том случае, если вы не хотите напрямую манипулировать «истинными» объектами и вовлекаете глубокую копию. Возможно, это не так, как вы пожелаете.