【问题标题】:C++ mapping unique classes and extracting subclasses from valueC++ 映射唯一类并从值中提取子类
【发布时间】:2011-10-06 01:15:50
【问题描述】:

这里是新的 C++ 程序员。

我有以下地图定义:

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

Option 是我创建的一个独特的类。我从来没有真正将 Option 类添加到我的地图中。相反,我总是添加一个继承自 Option 的类,例如,我有一个名为 IntOption 的类,它存储一个 int 变量(它所做的一切)。

现在我可以通过以下方式将 IntOption 添加到我的地图中:

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

这很好用,因为当我做一个

my_map["a key here"]

它将返回值“add”。

现在我向各位好人提出的问题是如何从返回值中获取子类变量?我可以做到以下几点

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

// getter 因为它不在基类中,而是在扩展 Option 的类中。

我该如何解决这个问题?

我考虑过 typedef std::map MapType;

我不知道如何进行动态转换,也不知道如何将指向类的指针添加到地图中。

【问题讨论】:

    标签: c++ map dynamic-cast


    【解决方案1】:

    它不会按照您设置的方式工作。该映射假设它仅包含 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 可能会对此有所帮助。

    【讨论】:

    • 您不能将 auto_ptr 存储在地图中(它不满足 CopyConstructible 的要求)。 shared_ptr 或 unique_ptr 会很好。
    • 这里的问题是,如果你有多个派生的Option类型,dynamic_cast会失败(返回null),你需要提前知道哪个item属于哪个类型才能成功。
    • @David 没错。我猜这是问题的本质所固有的——用户正在尝试存储可以是整数、字符串、日期或其他任何选项的选项。如何使用它是一个业务规则。
    猜你喜欢
    • 2010-09-16
    • 2021-08-11
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多