C++:列出从容器中消失的元素

C++: List elements disappearing from container

我正在调用一个函数来从两个文件中读取一些数据并将其插入 class Corso 的实例中。 class 由一个校友列表组成,每个校友都有一个必须填充的考试列表,这就是 leggiEsame() 完成的。对 leggiEsame() 的第一次调用正确地添加了数据。不过,第二次调用似乎是将 Exams 添加到之前的调用中,但在某些时候新数据会消失。我正在从 main:

调用函数
#include <iostream>
#include <Corso.h>

using namespace std;

int main()
{
    Corso c = Corso();
    c.leggiEsame("informatica.txt", Esame(1, "Informatica", "Danilo Franchini", 31, 18, 0, 10));
    c.leggiEsame("analisi.txt", Esame(2, "Analisi", "Marco Giovannetti", 31, 18, 0, 10));
    c.stampa();
    return 0;
}

leggiEsame() 是这样实现的:

void Corso::leggiEsame(string path, Esame e)
{
FILE *f = fopen(path.c_str(), "r");
if(f==NULL)
    printf("File non valido.\n");

CodPersona cod_p;
NumMatricola num_m;
char str_voto[20];
float voto;
Alunno al = Alunno();

while(!feof(f))
{
    char format[100] = "%[^\t]\t%[^\t]\t%[^\t]%*[^\n]\n";
    fscanf(f, format, cod_p, num_m, str_voto);

    if(string(str_voto)=="RIMANDATO")
        voto = RIMANDATO;
    else if(string(str_voto)=="30 e Lode")
        voto = LODE;
    else if(string(str_voto)=="ASSENTE")
        voto = ASSENTE;
    else
        voto = atof(str_voto);

    e.setVoto(voto);

    al.setCodPersona(string(cod_p));
    al.setNumMatricola(string(num_m));
    aggiornaAlunno(al, e);
    /*Alunno a = *cercaAlunno(al);
    printf("Alunno %s aggiornato, ha %d esami\n", a.numMatricola().c_str(), a.esami().size());*/
}

fclose(f);
}

aggiornaAlunno() 执行以下操作:

void Corso::aggiornaAlunno(Alunno a, Esame e)
{
Alunno a_found;
list<Alunno>::iterator it = cercaAlunno(a);
/// cerco l'alunno nella classe, se è già presente (iteratore diverso da m_alunni.end())
/// se l'alunno esiste già allora aggiorna i dati anagrafici dell'alunno
/// altrimenti aggiunge l'alunno alla classe.
if(it!=m_alunni.end())
{
    a_found = *it;
    a_found.aggiornaDati(a);
    /// se l'alunno già esistente non contiene l'esame allora lo aggiunge
    if(!a_found.contieneEsame(e, 0))
    {
        a_found.aggiungiEsame(e);
        printf("Aggiunto esame %d su %d a %s\n", e.id(), a_found.esami().size(), a_found.numMatricola().c_str());
    }
}
else
{
    printf("nuovo alunno\n");
    a.aggiungiEsame(e);
    aggiungiAlunno(a);
}
}

条件的 "else" 分支似乎工作正常,因为它添加了第一个读数的数据,而第二个读数调用 aggiungiEsame():

void Alunno::aggiungiEsame(Esame e)
{
m_esami.push_front(e);
printf("Aggiunto esame %d a %s, n esami: %d\n", e.id(), m_num_matricola.c_str(), m_esami.size());
}

在这个函数内部输出正常,似乎新数据已添加到每个检查列表中,因为大小输出 2,在 aggiornaAlunno() 内部也是如此。 当函数 returns 到 leggiEsame() 时,列表的大小再次输出 1,即使没有进行删除。 希望能帮到你,先谢谢了。

您没有将数据添加到现有的 Alunno 对象,而是将其添加到对象的 副本a_found = *it*it 的内容复制到 a_found 中,但它们是单独的对象。一旦 a_found 超出范围,它就会被销毁,连同您添加到其中的任何内容。