если у вас есть полиморфный объект (указанный объект может быть более специализированным, чем переменная), я предлагаю вам создать виртуальный метод clone (), который выделяет новый указатель с копией вашего объекта:
Base* A::clone() {
A* toReturn = new A();
//copy stuff
return toReturn;
}
Если вы не можете изменить свой базовый класс, вы можете использовать RTTI, но я не буду подходить к этому решению в этом ответе.(Если вам нужно больше подробностей в этом решении, задайте вопрос о полиморфном клонировании с RTTI.)
Если у вас нет полиморфного объекта, вы можете выделить новый объект, вызвав конструктор копирования.
void YourVector::push_back(Base* obj) {
Base* copy = new Base(obj);
}
Но пахнет тем, что вам действительно нужен shared_ptr, доступен в <tr1/memory>
(или <memory>
, если вы используете C ++ 0x).
Обновление на основе комментариев
У вас также может быть список параметров двух шаблонов:
template <typename T>
struct CopyConstructorCloner {
T* operator()(const T& t) {
return new T(t);
}
}
template <typename T, typename CLONER=CopyConstructorCloner<T> >
class MyList {
CLONER cloneObj;
public:
// ...
void push_back(const T& t) {
T* newElement = cloneObj(t);
// save newElemenet somewhere, dont forget to delete it later
}
}
При таком подходе можно определить новую политику клонирования для таких вещей, как указатели.
Тем не менее, я рекомендую вамиспользовать shared_ptrs.