0

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

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

所以说项目具有属性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 。

谢谢你们的帮助

4

2 回答 2

3

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

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

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

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

itemmap<DerivedItem>[vnum]->derivedFunction()
于 2011-12-27T11:13:11.023 回答
0

您将无法使用指针访问特定于DerivedItem类的成员。Item你可以投它:

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

....但这取决于知道哪些项目是地图中的哪种类型。

对于多态行为,通常您会在派生类中重写父类中的一个方法,该方法的行为不同。

于 2011-12-27T11:15:17.277 回答