2011-10-06 71 views
3

这里是新的C++程序员。C++映射唯一类并从值中提取子类

我有以下的地图定义:

typedef std::map<std::string, Option> MapType; 
MapType my_map 

选项是唯一的类我创建。我从来没有真正将Option类自己添加到我的地图中。相反,我总是添加一个继承自Option的类,例如我有一个名为IntOption的类,它存储了一个int变量(它的全部变量)。

现在我有没有问题,增加IntOption到我的地图做:

IntOption add; 
my_map.insert(std::pair<string, IntOption>("a key here", add)); 

这工作得很好,因为当我做了

my_map["a key here"] 

它会返回值“添加”。

现在我的问题给你所有的好人是如何得到的返回值的子类变量?我可以做以下

my_map["a key here"].getVariableA(); // this is in the base class Option. 

,但我不能这样做

my_map["a key here"].getIntVariable(); //this fails because it doesnt recognize the 

//吸气剂,因为它不是基类,但类扩展选项。

我该如何解决这个问题?我已经考虑过 typedef std :: map MapType;

买我不知道如何做动态铸造,也没有如何将指针添加到类的地图。

回答

2

它不会按照您设置的方式工作。该地图假定它只保存Option的实例,因此它将丢弃您尝试发送的任何IntOption数据。你将不得不回退到选项的指针。

typedef std::map<std::string, Option*> MapType; 

my_map["a key here"] = new IntOption(); 

IntOption *opt = dynamic_cast<IntOption*>(my_map["a key here"]); 

请注意,您必须现在处理内存管理,并决定何时取消分配选项。 std :: auto_ptr可能有帮助。

+2

您不能在映射中存储auto_ptr(它不符合CopyConstructible要求)。 shared_ptr或unique_ptr会很好。 –

+0

问题在于,如果您有多个派生选项类型,dynamic_cast将会失败(返回null),并且您需要事先知道哪个项目是哪种类型才能成功。 – David

+0

@大卫,这是正确的。我猜这是问题的本质固有的 - 用户试图存储可以是整数,字符串,日期等的选项。它如何使用是一项业务规则。 –