2011-11-25 123 views
1

我想實現以下方法來獲取與其名稱相對應的總線,該名稱作爲字符串傳遞給方法。這裏AbstractBus是一個包含總線功能的抽象類。 localBusses是一個std ::地圖將抽象類對象從映射存儲到抽象類參考

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

不過,我得到一個錯誤「沒有運營商‘=’這些操作數相匹配」 誰能解釋什麼是錯在這裏,我該如何糾正呢?

+0

你能發佈錯誤由你的編譯器報告? – hmjd

+1

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

+0

請發佈'localBusses'的確切聲明。 –

回答

1

的代碼存在幾個問題

  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