Я пишу библиотеку, и в ней у меня есть класс BaseClass. Любой, кто использует библиотеку, будет создавать свои собственные классы, которые наследуются от BaseClass. У меня есть еще один класс, позвоните ему Manager, который содержит вектор указателей BaseClass, который может содержать любой объект, полученный из BaseClass.C++ шаблоны с производными классами
Класс Manager ДОЛЖЕН обрабатывать создание и уничтожение любого объекта, добавленного в его вектор BaseClass. Это связано с тем, что любой объект в векторе можно удалить в любой момент, а сам Менеджер также можно удалить. Из-за этого пользователь библиотеки не может добавить объект в вектор baseClass Manager, передав ему указатель на уже существующий объект, полученный из BaseClass. На самом деле, я мог позволить пользователю сделать это. Но это будет связано с копированием фиктивного объекта, который я бы предпочел не делать.
Чтобы решить эту проблему, я пытаюсь использовать функцию шаблона. Пользователь должен передать тип объекта, полученного из BaseClass, при попытке добавить его в вектор Менеджера. Это то, что я сейчас имею.
//Manager.h
#include <vector>
#include "BaseClass.h"
#include <typeinfo>
class Manager {
//Vector holding pointers to any objects inherited from BaseClass
vector<BaseClass*> baseClasses;
//Template function that needs to add NEW object to baseClass vector
//This I'm having problems with
template<class T>
BaseClass* Add() {
BaseClass* baseClass = new T();
baseClasses.push_back(baseClass);
return baseClass;
}
//Template function that gets object from baseClass vector
//This works fine
template<class T>
BaseClass* Get() {
for (int i = 0; i < baseClasses.size(); i++) {
if (typeid(*baseClasses[i]) == typeid(T)) {
return baseClasses[i];
}
}
return NULL;
}
};
Например, пользователь должен делать это при добавлении или получении объекта из базового кластера менеджера. DerivedClass происходит от BaseClass
Manager manager;
//Add a new DerivedClass object to Manager's vector
manager.Add<DerivedClass>();
//Get a pointer to the DerivedClass object that was just added
DerivedClass* derivedClass = (DerivedClass*)manager.Get<DerivedClass>();
Функция Get() отлично работает. Мне нужно знать, как я могу заставить свою функцию Add() работать? Помощь будет принята с благодарностью.
Исправить код, чтобы отразить то, что является членом типа, а что нет. Вы также должны попытаться объяснить еще немного, почему вы думаете, что менеджер должен создавать объекты, и что именно вы подразумеваете под * любым объектом в векторе, может быть удален в любое время *, кто будет делать удаления? - что это не работает с вашей функцией «Добавить»? –
Какие проблемы у вас есть с функцией 'Добавить'? Из вашего вопроса, я понимаю, что это не сработает, но я хотел бы получить более подробную информацию, например, не скомпилировать/увязать? Это вызывает ошибку сегментации? Возвращает ли оно неправильное значение? – anatolyg
Если у вас есть указатель на базовый класс, а базовый класс имеет виртуальный деструктор, можно безопасно удалить объект с помощью указателя. –