如果我有一個地圖一類的作爲關於地圖和迭代器
class MyClass
{
public:
MyClass();
std::map<std::string, std::string> getPlatforms() const;
private:
std::map<std::string, std::string> platforms_;
};
MyClass::MyClass()
:
{
platforms_["key1"] = "value1";
// ...
platforms_["keyN"] = "valueN";
}
std::map<std::string, std::string> getPlatforms() const
{
return platforms_;
}
而且在我的主要功能會有這兩段代碼之間的差異這樣一個私有成員理論澄清?
代碼1:
MyClass myclass();
std::map<std::string, std::string>::iterator definition;
for (definition = myclass.getPlatforms().begin();
definition != myclass.getPlatforms().end();
++definition){
std::cout << (*definition).first << std::endl;
}
代碼2:
MyClass myclass();
std::map<std::string, std::string> platforms = myclass.getPlatforms();
std::map<std::string, std::string>::iterator definition;
for (definition = platforms.begin();
definition != platforms.end();
++definition){
std::cout << (*definition).first << std::endl;
}
在代碼2我剛剛創建了一個新的地圖變量來保存地圖從getPlatforms()函數返回。無論如何,在我的真實代碼中(我不能發佈實際的代碼,但它直接對應於這個概念)第一種方式(代碼1)導致運行時錯誤,無法訪問某個位置的內存。
第二種方式有效!
您能否告訴我這兩個不同代碼片段之間的理論基礎?
正如喬指出getPlatforms()是const,所以通過非const引用返回映射將是一個問題。 (從const方法返回值是沒有問題的,但正如我試圖解釋的那樣,按值返回是一個壞主意)。所以你想通過'const&'返回,在這種情況下,Joe對const_iterator的描述將會變得正確。 – JSF
謝謝。如果您不介意的話,可以附帶一些後續問題:(1)如何通過引用返回地圖? (2)通過引用還是按值返回對象最好? – nonremovable
而不是'std :: map getPlatforms()const;''你使用'std :: map const&getPlatforms()const;那麼你需要切換到你的code1的const_iterator。 –
JSF