繁体   English   中英

C ++在地图中存储派生对象

[英]C++ storing derived objects within a map

是的,我对C ++还是很陌生,所以我还在这里学习。 如果我以错误的方式进行操作,请告诉我,但如果可能,请尝试指出正确的方向(perhpaps带有指向教程的链接)。

我一直在玩std :: map,并用它来存储对象(项目)。 这很好。 问题是试图将派生项存储在地图中。 我有它的工作,但它似乎正在切片派生的对象。

所以说item具有属性a,b和c。 食物是从具有额外属性d和e的商品中获得的。 将d和e存储在项目映射中时,我无法访问它。 编译器说:

“错误:“类项目”没有名为“ d”的成员”

是否有可能使用std :: map多态性?还是需要使用另一个类似boost的库? Boost似乎相当复杂,我希望在我仍在学习的同时,有一种方法可以使用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()

您将无法使用Item指针访问特定于DerivedItem类的成员。 您可以将其转换为:

val = static_cast<DerivedItem*>(itemmap[vnum])->d;

....但这取决于了解地图中哪些项目是哪种类型。

对于多态行为,通常在父类中有一个行为会有所不同的方法,该方法在派生类中被覆盖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM