将类添加到地图中

时间:2014-07-26 15:44:48

标签: c++ class map

我正在尝试将一个类对象添加到地图中,这就是我所拥有的:

#include<vector>
#include<map>
#include<stdio.h>
#include<string>
#include<iostream>

using namespace std;

class Student{
    int PID;
    string name;
    int academicYear;
public:
    Student(int, string, int);
};

Student::Student (int P, string n, int a) {
    PID = P;
    name = n;
    academicYear = a;
}

void createStudent(map<string, Student>);

int main(int argc, char** argv){

    map <string, Student> studentList;

    createStudent(studentList);
}


void createStudent(map<string, Student> studentList){

    int PID;
    string name;
    int academicYear;

    cout << "Add new student-\nName: ";
    getline(cin, name);
    cout << "PID: ";
    cin >> PID;
    cout << "Academic year: ";
    cin >> academicYear;

    Student newstud (PID, name, academicYear);

    studentList[name] = newstud;  //this line causes the error: 
                                  //no matching function for call to 
                                  //'Student::Student()'
}

我不明白为什么在那里调用构造函数,我认为newstud已经从前一行构建了。当我尝试将newstud添加到地图时,有人能解释发生了什么吗?

2 个答案:

答案 0 :(得分:2)

  • 问题1

std::map::operator[]将使用默认构造函数将新元素插入到容器中,如果它不存在,在您的情况下不存在,即使您提供了构造函数也可能没有意义。

因此请使用std::map::insert来处理此类情况

  • 问题第二

即使您使用studentList.insert(std::make_pair(name, newstud));成功插入,它也不会反映studentList中原始地图main ( )的更改,除非您使用参考类型,在函数定义&amp;声明createStudent

所以使用

void createStudent(map<string, Student>& );

答案 1 :(得分:1)

要使用此功能添加条目,您应该通过引用传递参数studentList

而不是

studentList[name] = newstud; 

使用:

studentList.insert(std::make_pair(name, newstud));

只是一个建议。