J'utilise ptr_map de boost pour stocker des objets dérivés d'un type abstrait de base.ptr_map et pointeur
class Entity { virtual void foo() = 0; };
class Entity1 : public Entity {};
class Entity2 : public Entity {};
boost::ptr_map<string, Entity> someMap; // We could store pointers for abstract type
Insertion fonctionne très bien:
someMap.insert("someKey", new Entity1());
someMap.insert("someKey", new Entity2());
Mais pas le retour de la carte:
template<typename EntityType>
EntityType *GetEntity(const string &entityName)
{
return dynamic_cast<EntityType*>(&someMap[entityName]);
}
GetEntity<Entity1>(entityName);
Maintenant le problème: opérateur [] de référence ptr_map retourne! Ainsi, dans constructur, il peut y avoir appel de type à partir de la valeur. Maintenant compilateur échoue avec l'erreur:
instantiated from ‘EntityType* EntityManager::GetEntity(const std::string&) [with EntityType = Entity1, std::string = std::basic_string<char>]’
error: cannot allocate an object of abstract type ‘Entity’
S'il y a une méthode qui retourne dans ptr_map pointeur sur la valeur, il woudln't y avoir aucun problème. Que pourriez-vous dire à ce sujet?
probablement vous voulez dire: l'opérateur [] instanciera la valeur/l'objet, pas la clé. De plus, la clé n'est pas abstraite ici. –