ptr_map和指针

时间:2010-06-27 18:08:11

标签: boost reference map pointers abstract

我正在使用boost中的ptr_map来存储从某个基本抽象类型派生的对象。

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

插入效果很好:

someMap.insert("someKey", new Entity1());
someMap.insert("someKey", new Entity2());

但不是从地图返回:

template<typename EntityType>
EntityType *GetEntity(const string &entityName)
{
    return dynamic_cast<EntityType*>(&someMap[entityName]);
}

GetEntity<Entity1>(entityName);

现在问题:ptr_map的 operator [] 返回引用!所以在构造函数中,可以从值中调用类型。 现在编译器失败并出现错误:

 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’

如果ptr_map中有任何方法返回指向该值的指针,那么就不会出现任何问题。你能怎么说呢?

1 个答案:

答案 0 :(得分:4)

一个经常被遗忘的事实是,如果密钥不存在,operator []将实例化密钥。这是你的问题,因为密钥是抽象的。 所以相反,使用at()。 也就是说,

return dynamic_cast<EntityType*>(&someMap.at(entityName));

有关详情,请参阅"Semantics: lookup"部分

顺便说一句,我会质疑你的设计决定是否公开存储在容器中的原始指针,其目的是减轻内存管理。