2011-12-27 45 views
0

对,我对C++相当陌生,所以我仍然在这里学习。如果我以错误的方式解决这个问题,请告诉我,但如果可能,请尝试指向正确的方向(通过链接指导教程)。在地图中存储派生对象的C++

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

所以说项目具有属性a,b和c。食物来自具有额外属性d和e的物品。存储在项目地图中时,我无法访问d和e。编译器说:

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

是否可以使用std ::地图polymorphicaly或者我需要使用另一个库像升压? 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衍生项目。

感谢您的帮助球员

+2

这一切都将是一场可怕的内存泄漏噩梦。您应该使用智能指针。 – 2011-12-27 12:18:52

+0

我正在使用它来学习,在程序关闭之前,地图中的项目不会被删除,所以不应该有内存泄漏。 – DizzyDuke 2011-12-27 16:35:43

回答

3

您可以使用dynamic_cast投回到派生类,如果你knwo它是什么类。

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

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

如果你想这是自动完成的,你可以的std ::地图,其中[]运营商有一个模板参数推导出一个新的模板类。但在这种情况下,你有,当你获得该项目通过类型:

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

您应该提到这一点,函数和容器必须通过_pointers_,而不是_values_。 – 2011-12-27 11:41:56

+0

这不是我想要的答案,但它指出了我的正确方向。谢谢! – DizzyDuke 2011-12-27 16:37:18

0

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

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

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

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

+0

你为什么复制Alessandro的答案?如果这是故意的,那么SO是错误的 – Ulterior 2011-12-27 11:19:54

+1

@Ulterior - 它不是重复的。(a)我的第一句和最后一句的解释和建议并未出现在另一个答案中,(b)我的代码行有点不同,(c)OP中的误解只能用很多方式解释。 SO工作正常。当另一个答案显示时,我正在打字,我认为这些差异是有足够理由在此留下的。 – sje397 2011-12-27 11:26:59

+0

我会推荐'dynamic_cast'在'static_cast'上。 – 2011-12-27 11:42:38