gpt4 book ai didi

C++ 在映射中存储派生对象

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

是的,我对 c++ 还很陌生,所以我仍在学习。如果我以错误的方式解决这个问题,请告诉我,但如果可能的话请尝试为我指明正确的方向(perhpaps 带有教程链接)。

我一直在玩弄 std::map 并用它来存储一个对象(项目)。这很好用。问题是试图在 map 中存储派生项目。我已经让它工作了,但它似乎正在分割派生对象。

假设项目具有属性 a、b 和 c。而食物是从具有额外属性 d 和 e 的项目派生出来的。当 d 和 e 存储在项目 map 中时,我无法访问它。编译器说:

“错误:‘class item’没有名为‘d’的成员”

是否可以使用 std::map 多态性,或者我是否需要使用另一个库,如 boost? Boost 看起来相当复杂,我希望在我还在学习的时候有一种方法可以用 map 来实现。以下是我正在使用的一些代码,以便更清楚地说明我的意思。

项目 map 声明如下:

typedef std::map <int, tItem*> itemMap;

东西是这样加进去的:

Item * item = new Item (a, b, c);
itemmap [vnum] = item;
DerivedItem * deriveditem = new DerivedItem (a, b, c, d, e);
itemmap [vnum] = deriveditem;

这可行,但我无法访问派生项的 d 和 e。

谢谢大家的帮助

最佳答案

如果您知道它是什么类,您可以使用dynamic_cast 转换回派生类。

dynamic_cast<DerivedItem*>(itemmap[vnum])->derivedFunction();

http://en.wikipedia.org/wiki/Dynamic_cast

如果您希望自动完成此操作,您可以从 std::map 派生一个新的模板类,其中 [] 运算符有一个模板参数。但在这种情况下,您必须在获取项目时传递类型:

itemmap<DerivedItem>[vnum]->derivedFunction()

关于C++ 在映射中存储派生对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8643964/

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