Vecteur de structures: l'ajout d'éléments de C++
Je suis à la lecture de mon les structures à partir d'un fichier, et je voudrais ajouter à vecteur de structures.
Voici à quoi il ressemble et fonctionne:
typedef struct
{
int ID;
string name;
string surname;
int points;
}
Student;
int main()
{
ifstream theFile("test.txt");
std::vector<Student*> students;
Student* s = new Student();
while(theFile >> s->ID >> s->name >> s->surname >> s->points)
{
studenti.push_back(s); //here I would like to add this struct s from a file
}
//here I want to print each struct's values on the screen, but the output is always ONLY last struct N times, and not all of them, each only once
std::vector<Student*>::const_iterator it;
for(it = students.begin(); it != students.end(); it+=1)
{
std::cout << (*it)->ID <<" " << (*it)->name << " " << (*it)->surname <<" " << (*it)->points <<endl;
}
Que dois-je faire si je peux ajouter mon structs à un vecteur, et de les imprimer normalement (cette impression n'est qu'une case vraiment, si les structures sont correctement chargé dans le vecteur)?
Pourquoi, oh pourquoi le
Et quel est le format de fichier? Est-ce que chaque nom de l'élève consiste justement à deux mots?
Notez que vous n'avez pas un vecteur de structs, vous avez un vecteur de pointeurs. Tous de qui pointent vers le même objet...
typedef
?Et quel est le format de fichier? Est-ce que chaque nom de l'élève consiste justement à deux mots?
Notez que vous n'avez pas un vecteur de structs, vous avez un vecteur de pointeurs. Tous de qui pointent vers le même objet...
OriginalL'auteur Whizzil | 2013-04-06
Vous devez vous connecter pour publier un commentaire.
Voici comment le code peut regarder en C++ moderne:
Utilisation:
Vous avez raison,
Student
besoin d'un constructeur approprié. J'ai ajouté un. Alternativement, vous pouvez direresult.push_back({id, name, surname, points});
et vous n'avez pas besoin d'ajouter un constructeur pour cette version.Très élégante solution. Je vous remercie.
Pas de problème 🙂 Merci pour cette erreur! Pour le record, je pense que
push_back
et d'agrégation d'initialisation est la meilleure solution dans ce cas; je ne vais pas changer la définition de la classe juste pour accueillir des terrils. Vous pouvez emplace lorsque la classe est livré avec un constructeur approprié.OriginalL'auteur Kerrek SB
Votre erreur est d'utiliser des pointeurs
Maintenant, il va travailler.
Le problème était que vous étiez en réutilisant les même pointeur plus et plus. Si vous vous retrouvez avec un vecteur de pointeurs pointent toutes dans le même objet. Qui ont des valeurs pour le dernier élève de lire dans.
Il semble assez débutant trait à choisir le complexe alternative la plus simple est la bonne, donc je serais intéressé de savoir pourquoi vous avez choisi d'utiliser des pointeurs.
Je pensais que ce serait mieux si j'ai utilisé les pointeurs car j'ai besoin d'appeler des méthodes sur cette liste plus tard dans le programme. Mais je ne suis pas expérimenté avec les pointeurs, et c'était simplement une idée. Pas sûr au sujet des avantages et des inconvénients de pointeurs, tbh vraiment.
Vous pouvez appeler des méthodes sur la liste sans l'aide de pointeurs. Il ne fait aucune différence, par exemple,
students[i].some_method();
.OriginalL'auteur john
Puisque vous voulez stocker des pointeurs vers les Étudiants, mais pas les Étudiants dans le vecteur.
Vous avez alloué un seul Élève, et à chaque fois que vous boucle, vous lisez encore et encore.
Au lieu de cela, vous devez allouer un nouvel étudiant sur chaque boucle et lire dans les nouvelles de la mémoire allouée.
Ne pas oublier de supprimer chaque élève lorsque vous n'avez pas besoin de vecteur plus.
OriginalL'auteur
votre code ne fonctionne pas parce que vous avez un Étudiant de l'objet et écraser ses membres à chaque fois. La Solution est de créer un nouvel Étudiant objet à chaque fois et de passer un pointeur de votre vecteur:
OriginalL'auteur 4pie0