将抽象类对象从地图存储到抽象类引用

时间:2011-11-25 14:51:47

标签: c++ map abstract-class

我正在尝试实现以下方法来获取与其名称相对应的总线,该总线作为字符串传递给方法。这里AbstractBus是一个包含总线功能的抽象类。 localBusses是一个std :: map

void getLocalBusByName(string& name, AbstractBus& bus) 
{
    bus =  localBusses.find(name)->second;
}

然而,我收到错误“no operator”=“匹配这些操作数” 任何人都可以解释这里有什么问题,我该如何纠正呢?

1 个答案:

答案 0 :(得分:1)

代码提出了几个问题

  1. 当localBusses.find(...)找不到公共汽车时,它不处理这种情况
  2. 您似乎想要返回对找到的总线的引用。您应该记住引用是别名,它们只能在声明时绑定并在之后保持不可变。也就是说,您无法将引用重新绑定到另一个对象
  3. 在2之后,bus = ...尝试调用赋值运算符以将找到的总线分配给引用所引用的总线。赋值运算符不存在或不可访问。这很好,因为在这个上下文中有一个赋值运算符是一个坏主意,如果存在它可能会导致切片,如果AbstractBus类是可实例化的(非抽象)。
  4. 编辑:我相信你要么:

    typedef std::map<string, AbstractBus*> tBussesMap;
    tBussesMap localBusses;
    

    或AbstractBus不是真正的抽象(不包含任何纯方法)(尽管它的名字)

    在任何一种情况下,我都假设你有从AbstractBus派生的类。并且getLocalBusByName必须提供没有找到总线的情况,并避免无意中切片。

    所以你应该在以下行中编写getLocalBusByName方法:

    AbstractBus* 
    getLocalBusByName( const string& name )
    {
        tBussesMap::iterator it = localBusses.find(name);
    
        if ( it != localBusses.end() )
        {
            return it->second;
        }
    
        return nullptr;
    }
    

    其中localBusses的类型为:std::map<string, AbstractBus*>(如果AbstractBus是抽象的唯一可行的方法)