gpt4 book ai didi

c++ - 如何构建一个 Map,其中 Key 是一个抽象基类(不是 Value)

转载 作者:行者123 更新时间:2023-11-28 04:41:05 25 4
gpt4 key购买 nike

我正在尝试构建一个对象映射,这些对象是各种派生类的实例,基类是抽象的:

class B {void SomeMethod() = 0;}; //abstract
class D1 : public B {...}; // not abstract
class D2 : public B {...}; // not abstract
std::unordered_map<B,int> myMap;

D1 * d1 = new D1();
D2 * d2 = new D2();
myMap.insert({*d1,5}
myMap.insert({*d2,8}

那是行不通的,因为 map 认为 *d1 是一个 B 对象,并试图在 map 内部复制构造它。即使可行,它也会切片对象,并且 D1 数据会丢失。到目前为止,我明白为什么它不起作用。

但是我怎样才能制作这样的 map 呢?

  • 存储 B* 指针可以正常工作,但是 map 的散列算法随后比较指针,而不是对象,这将找不到匹配项
  • 我没有找到覆盖 = 运算符的方法(而且确实不可能,因为散列算法作用于参数,它是一个指针 - 我将不得不覆盖散列算法本身以取消对指针的引用。
  • 注意 C++ collection of abstract base classes不是重复的——它谈论的是值(value);我需要抽象基类作为 Key,所以我可以find() 它。

换句话说,问题是:
我如何构建对象映射(然后搜索它们),其中这些对象是来自公共(public)基类的不同派生类的实例?

最佳答案

是的,你的第二个选择是不可能的。但你的第一个是!标准库容器允许您使用自定义哈希函数,您可以利用它来发挥自己的优势。

此外,无论如何您都需要提供自定义哈希函数,因此这应该不是问题。您还提到您希望能够搜索它们,对吗?好吧,标准库还允许您自定义 that 并且您可以提供一个关键的相等对象来比较底层对象而不是指针。

struct FooPtrHash {
std::size_t operator()(const Foo *Value) const {
return Value->Value;
}
};

struct FooPtrEquality {
bool operator()(const Foo *Lhs, const Foo *Rhs) const {
return *Lhs == *Rhs;
}
};

std::unordered_map<Foo*, int, FooPtrHash, FooPtrEquality> Map;

关于c++ - 如何构建一个 Map,其中 Key 是一个抽象基类(不是 Value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50180978/

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