ptr_map 和指针

发布于 2024-09-07 09:27:12 字数 1029 浏览 5 评论 0原文

我使用 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 中有任何方法返回指向该值的指针,则不会有任何问题。对此你能说什么?

I'm using ptr_map from boost for storing objects derived from some base abstract type.

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

Inserting works great:

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

But not returning from map:

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

GetEntity<Entity1>(entityName);

Now the problem: operator[] of ptr_map returns reference! So in constructur there could be calling type from value.
Now compiler fails with error:

 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’

If there is any method in ptr_map which returns pointer to the value, there woudln't be any problems. What could you say about this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

世界和平 2024-09-14 09:27:27

一个经常被遗忘的事实是,如果键不存在,operator[] 将实例化该键。这在您的情况下是一个问题,因为密钥是抽象的。
因此,请使用 at()。
也就是说,

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

有关详细信息,请阅读 " 语义:顺便说一句

,我会质疑您的设计决定,即公开存储在容器中的原始指针,其目的是减轻内存管理。

An oft forgotten fact is that operator[] will instantiate the key if it doesn't exist. This is a problem in your case because the key is abstract.
So instead, use at().
That is,

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

For more info, read the "Semantics: lookup" section

BTW, I would question your design decision to expose raw pointers stored within container whose very purpose is to alleviate memory management.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文