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 に答える