是的,我是c ++的新手,所以我还在这里学习。如果我以错误的方式解决这个问题,请告诉我,但如果可能的话,尽量指出正确的方向(perhpaps指向教程的链接)。
我正在玩std :: map并用它来存储一个对象(item)。这很好用。问题是尝试在地图中存储派生项目。我已经有了它的工作,但它似乎正在切割派生对象。
所以说item有属性a,b和c。食物来源于具有额外属性d和e的项目。当它存储在项目地图中时,我无法访问d和e。编译器说:
“错误:'class item'没有名为'd'的成员”
是否可以使用std :: map polymorphicaly或者我是否需要使用另一个像boost这样的库? Boost看起来相当复杂,我希望在我还在学习的时候有办法用地图做。这是我正在玩的一些代码,以使我更清楚我的意思。
项目地图声明如下:
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。
感谢帮助人员
答案 0 :(得分:3)
如果您知道它是什么类,您可以使用dynamic_cast
强制转换为派生类。
dynamic_cast<DerivedItem*>(itemmap[vnum])->derivedFunction();
http://en.wikipedia.org/wiki/Dynamic_cast
如果您希望自动完成此操作,可以从std :: map派生新的模板类,其中[]
运算符具有模板参数。但在这种情况下,你必须在获得项目时传递类型:
itemmap<DerivedItem>[vnum]->derivedFunction()
答案 1 :(得分:0)
您将无法使用DerivedItem
指针访问特定于Item
类的成员。你可以施展它:
val = static_cast<DerivedItem*>(itemmap[vnum])->d;
....但这取决于知道哪些项目是地图中的哪种类型。
对于多态行为,通常会在派生类中重写父类中的方法,行为方式不同。