0

我正在尝试编写一个函数,它将信息从文本文件输入到地图中。我的主要代码如下:

int main(){
    typedef map<int,student*> record;
    record allstudents;
    fileinput("inputtest.txt",allstudents);


    //rest of code....
}

其中函数'fileinput'定义为:

void fileinput(string datafile, record map){ 
    fstream file1(datafile);
    if(!file1.good()){
    //error code
    }
    //Pulls information from file
    student* S1= new physics(name,ID); //creates a new pointer
    //(*S1).printinfo(); //Can print info if required for de-bug
    map[ID]=S1; //store to map
    entries++;  //counts entries read in            
    }
    cout<<"Import complete. "<<entries<<" new students entered."<<endl;
}

当我从测试文件运行这段代码时,如果我取消注释,它将读入数据并正常输出,(*S1).printinfo();并且会正确计算已读入的学生人数。但是当我回到我的主要功能并输出时现在存储在allstudents那里的东西似乎什么都没有?

为什么会发生这种情况,有人知道解决这个问题的方法吗?我已经删掉了很多代码来尝试使其更易于阅读,但是如果您需要查看其余代码,我可以随时对其进行编辑。

谢谢。

4

2 回答 2

2

这是因为您是map 按值传递的。将函数的签名更改为

void fileinput(string datafile, record &map)

map简短说明:当您按值传递时,会生成参数 ( )的副本。在您的函数中,您对该副本执行修改,但是当函数返回并且副本超出范围时,这些修改会丢失。它们不会自动传播回“源”对象。

有关详细说明,请参阅通过引用传递/C++ 中的值

于 2012-04-21T13:20:11.493 回答
2

您正在按值传递地图,因此该函数使其成为自己的副本,而您的原始副本保持不变。尝试通过引用传递:

void fileinput(string datafile, record& map) { ... }
                                      ^ reference! 
于 2012-04-21T13:20:21.023 回答