将抽象类对象从映射存储到抽象类参考

将抽象类对象从映射存储到抽象类参考

问题描述:

我想实现以下方法来获取与其名称相对应的总线,该名称作为字符串传递给方法。这里AbstractBus是一个包含总线功能的抽象类。 localBusses是一个std ::地图将抽象类对象从映射存储到抽象类参考

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

不过,我得到一个错误“没有运营商‘=’这些操作数相匹配” 谁能解释什么是错在这里,我该如何纠正呢?

+0

你能发布错误由你的编译器报告? – hmjd

+1

本地是否将字符串映射到AbstractBus或AbstractBus *(指向AbstractBus的指针)? – kbyrd

+0

请发布'localBusses'的确切声明。 –

的代码存在几个问题

  1. 时localBusses.find(...)没有按#找不到总线
  2. 你似乎想参考返回发现它不处理的情况下总线。你应该记住,引用是别名,它们只能在声明时绑定,并在之后保持不变。也就是说,您不能重新绑定对另一个对象的引用
  3. 在2之后,总线= ...尝试呼叫赋值运算符以将找到的总线分配给引用引用的总线。赋值运算符不存在或不可访问。这很好,因为在这种情况下有一个赋值运算符是一个坏主意,如果存在的话,如果AbstractBus类可以实例化(非抽象的),它可能会导致切片。

编辑:我相信你要么有:

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

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

在这两种情况下,我认为你有从AbstractBus派生的类。并且getLocalBusByName必须提供没有找到总线的情况,并避免无意切割。

所以,你应该写getLocalBusByName方法中的台词:这里localBusses被假定为类型的

AbstractBus* 
getLocalBusByName(const string& name) 
{ 
    tBussesMap::iterator it = localBusses.find(name); 

    if (it != localBusses.end()) 
    { 
     return it->second; 
    } 

    return nullptr; 
} 

std::map<string, AbstractBus*>(如果AbstractBus是抽象的唯一可行的办法)

+0

非常感谢您的帮助 –

+0

@sufyan siddique您好! – ds27680