Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 打印地图中的所有对 PhonebookEntry pb1(“奥拉诺曼”); pb1.添加(“主页”、“11234567”); pb1.添加(“工作”、“11065432”); cout_C++_Map - Fatal编程技术网

C++ 打印地图中的所有对 PhonebookEntry pb1(“奥拉诺曼”); pb1.添加(“主页”、“11234567”); pb1.添加(“工作”、“11065432”); cout

C++ 打印地图中的所有对 PhonebookEntry pb1(“奥拉诺曼”); pb1.添加(“主页”、“11234567”); pb1.添加(“工作”、“11065432”); cout,c++,map,C++,Map,getNumbers()正在返回映射的副本,而不是对它的引用。该副本在包含函数调用的表达式末尾被销毁,因此在循环过程中迭代器无效,对其执行任何操作都会产生未定义的行为 它应该看起来像: class PhonebookEntry{ private: std::string name; std::map<std::string, std::string> numbers; public: PhonebookEntry(std::string name) : nam

getNumbers()
正在返回映射的副本,而不是对它的引用。该副本在包含函数调用的表达式末尾被销毁,因此在循环过程中迭代器无效,对其执行任何操作都会产生未定义的行为

它应该看起来像:

class PhonebookEntry{
private:
    std::string name;
    std::map<std::string, std::string> numbers;
public:
    PhonebookEntry(std::string name) : name(name){}
    std::map<std::string, std::string> getNumbers() const {return numbers;}

    void add(const std::string label,const std::string number){numbers[label] = number;}
};

有了这个更改,您的代码应该可以按预期工作

如果这是您的方法:

map<string,string> const & getNumbers() const;
                   ^^^^^^^              ^^^^^
首先,它使用一个映射副本进行初始化。然后,将其与另一个副本的结束迭代器进行比较。您需要通过引用返回地图:

for(it = pb1.getNumbers().begin(); it != pb1.getNumbers().end(); ++it) { ... }
const std::map&getNumbers()const{return numbers;}

这里有两个独立的问题:

  • 将值插入临时文件并打印它
  • 在临时文件销毁后使用其迭代器
  • 问题1
    正如Mike在回答中解释的那样,
    getNumbers()
    返回的临时值在循环体中无效。

    是否返回引用或映射的副本?如果它返回一个副本,那么在您对它进行迭代之前它将被销毁,因此任何事情都可能发生。
    PhonebookEntry::getNumbers
    的返回值是多少?如果它不返回引用,则您正在创建一个临时值,插入一个值,然后打印它,而不修改实际的电话簿。@MatthiasVallentin但他不是在用函数
    pb1.add()
    ?这是我的公共get metdog:std::map getNumbers()const{return numbers;}@Skogen:请通过提供
    PhonebookEntry
    的相关代码来扩展您的示例,包括
    add
    。即使副本继续存在,循环也会比较来自不同副本的迭代器,这是无效的…/PhonebookEntry.cpp:14:错误:它=((常数标准::map@Skogen:可能您只有
    const
    版本?如果您不想公开可修改的引用,这很好,但在这种情况下,您需要将
    it
    的类型更改为
    const\u迭代器
    map<string,string> const & getNumbers() const;
                       ^^^^^^^              ^^^^^
    
    std::map<std::string, std::string> getNumbers() const {return numbers;} 
    
    for(it = pb1.getNumbers().begin(); it != pb1.getNumbers().end(); ++it) { ... }
    
    const std::map<std::string, std::string>& getNumbers() const {return numbers;} 
    
    cout << pb1.getNumbers()["Home"] << endl;
    
    for(it = pb1.getNumbers().begin(); it != pb1.getNumbers().end(); ++it) { ... }