gpt4 book ai didi

c++ - 包含抽象基类的 ptr_map 的映射对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:56 27 4
gpt4 key购买 nike

我有一个 boost::ptr_map,它将抽象基类(例如 VectorWrapperBase)存储为值,这允许我将字符串映射到不同类型的 vector 。

boost::ptr_map<std::string, VectorWrapperBase> memory_map;
//...
memory_map.insert(str_key, new VectorWrapper<T>());

这似乎有效。但是,当我将 memory_map 作为另一个类的成员并尝试将该类存储在 std::map 中时,编译失败。

class AgentMemory {
//...
private:
boost::ptr_map<std::string, VectorWrapperBase> memory_map;
};

std::map<std::string, AgentMemory> agent_map;
//...
agent_map.insert(std::pair<std::string, AgentMemory>(agent_name, AgentMemory()));

最后一行失败:

/SOMEPATH/boost_1_48_0/boost/ptr_container/clone_allocator.hpp:34
error: cannot allocate an object of abstract type ‘xyz::VectorWrapperBase’

作为 C++ 的新手,这令人费解。

怀疑错误归因于复制 AgentMemory 对象的 map 插入,这涉及克隆 ptr_map。因为我的 VectorWrapper 对象不是 cloneable , 引发错误。

我的问题是:

  • 为什么我会收到错误消息? (我的怀疑是否接近实际发生的情况?)
  • 我该如何解决这个问题?

为了解决编译错误,我考虑了以下方法,但没有太多的 C++ 经验无法决定哪个更合适:

  1. 删除纯说明符 (= 0) 因此 VectorWrapperBase 不再是抽象的
    • 这感觉像是一个 hack,因为永远不应实例化 VectorWrapperBase
  2. 制作 VectorWrappers cloneable
    • This seems to work ,但在我的用例中,只有空容器被分配给顶级 map ,因此永远不需要克隆内部 ptr_map 中的 VectorWrappers。因此,可克隆性只是为了安抚编译器,并不反射(reflect)实际使用情况。
  3. 忘记 ptr_map 并使用 std::mapshared_ptr 代替。
    • 我不太喜欢这个解决方案,因为我希望 vector 包装器的生命周期与 map 的生命周期相关联。我也有点担心(也许是不必要的?)在大量多线程应用程序中大量使用 shared_ptr 的潜在开销。

最佳答案

声明

agent_map.insert(std::pair<std::string, AgentMemory>(agent_name, AgentMemory()));

将调用 AgentMemory 的默认构造函数,这又将调用 boost::ptr_map<std::string, VectorWrapperBase> 的默认构造函数,它将尝试为抽象基类调用不存在的构造函数 VectorWrapperBase .

所以你必须确保每个类型的构造函数包装或继承VectorWrapperBase应该总是构造一个具体的派生类。在您的情况下,选项 3(共享指针到派生类的映射)可能是明智的,但这取决于代码的更大上下文。

关于c++ - 包含抽象基类的 ptr_map 的映射对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10515143/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com