Comment modifier un objet qui est dans un vector?

Le
Lolotte15 offline Hors ligne
Bonjour,
cela fait quelques jours que je programme en C++.Du coup je ne comprend pas pourquoi je n'arrive pas à modifier la valeur de mon objet qui est dans le vector.

int main()
{

Fichier f; //Création fichier
Identification i = Identification("e;e;e;Id_I45"e;e;e;, "e;e;e;bvhbdfhbdbfu"e;e;e;); //création Identification.
f.AjoutIdentification(&i); //ajout objet Identification dans le vector de Fichier.
f.GetLaDernièreIdentification().SetDateBST("e;e;e;e;e;ddddd"e;e;e;e;e;);//modification de l'attribut dateBST du dernier objet Identification
cout << f.GetLaDernièreIdentification().ToString() << endl; //Affichage du dernier objet Identification mais il n'a pas modifier DateBST.
};

Fichier :
//constructeur.
Fichier::Fichier()
{
_nom = "e; "e;;
lesIdentifications = vector<Identification>();
}
//méthode.
void Fichier::AjoutIdentification(Identification *uneId)
{
lesIdentifications.push_back(*uneId);
}
//get dernier objet du vector.
Identification Fichier::GetLaDernièreIdentification()
{
return lesIdentifications.back();
}

Identification:
//constructeur.
Identification::Identification(string unId, string unDebutId) {
this->id = unId;
this->dateDebutId=unDebutId;
this->dateBst;
this->dateFinScan;
this->error=true;
}

//set.
void Identification::SetDateBST(string DateBST) {
this->dateBst = DateBST;
}

Pouvez-vous m'expliquer?
  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
Arnaud Meurgues
Le #26564557
Le jeudi 7 janvier 2021 Í  15:37:07 UTC+1, Lolotte15 a écrit :
Bonjour,
cela fait quelques jours que je programme en C++.Du coup je ne comprend pas
pourquoi je n'arrive pas Í  modifier la valeur de mon objet qui est dans le
vector.
//get dernier objet du vector.
Identification Fichier::GetLaDernièreIdentification()
{
return lesIdentifications.back();
}

Ici, ce qui est retourné est un objet Identification, et non un quelque chose qui pointe vers l'identification qui se trouve dans le vector. Du coup, une copie de ce dernier est créée et c'est sur cette copie que vous faites une modification, ce qui ne modifie pas l'Identification qui se trouve dans le vector.
Il faudrait plutÍ´t renvoyer une référence :
&Identification Fichier::GetLaDernièreIdentitication() {}
Quelques petites remarques :
//méthode.
void Fichier::AjoutIdentification(Identification *uneId)
{
lesIdentifications.push_back(*uneId);
}

Il est souvent préférable de passer des références plutÍ´t que des pointeurs sauf dans le cas o͹ vous considérez légitime de passer un pointeur null et, dans ce dernier cas, il faut tester le cas o͹ le pointeur est null. Ici, *uneId pourra donner un segmentation fault si le pointeur est null.
Identification:
//constructeur.
Identification::Identification(string unId, string unDebutId) {
this->id = unId;
this->dateDebutId=unDebutId;
this->dateBst;
this->dateFinScan;
this->error=true;
}

Il est préférable d'utiliser la construction des champs d'une classe ainsi :
Identification::Identification(string unId, string unDebutId) :
id(unId),
dateDebutId(unDebutId),
//... ici, je ne sais pas d'o͹ viennent dateBst et dateFinScan qui ne sont pas en paramètre du constructeur
error(true)
{}
Ainsi, cela construit les objets directement avec la bonne valeur au lieu de les construire avec la valeur par défaut, puis leur changer leur valeur dans le corps du constructeur.
Par ailleurs, il est souvent préférable de passer des références sur les string (string& unId, string& unDebutId) pour éviter une copie inutile.
--
Arnaud Meurgues
lolotte15 offline Hors ligne
Le #26566298
Le vendredi 08 Janvier 2021 à 12:27 par Arnaud Meurgues :
Le jeudi 7 janvier 2021 Í  15:37:07 UTC+1, Lolotte15 a
écrit :
Bonjour,
cela fait quelques jours que je programme en C++.Du coup je ne comprend pas
pourquoi je n'arrive pas Í  modifier la valeur de mon objet qui
est dans le
vector.

//get dernier objet du vector.
Identification Fichier::GetLaDernièreIdentification()
{
return lesIdentifications.back();
}

Ici, ce qui est retourné est un objet Identification, et non un quelque
chose qui pointe vers l'identification qui se trouve dans le vector. Du coup,
une copie de ce dernier est créée et c'est sur cette copie que
vous faites une modification, ce qui ne modifie pas l'Identification qui se
trouve dans le vector.
Il faudrait plutÍ´t renvoyer une référence :
&Identification Fichier::GetLaDernièreIdentitication() {}

Quelques petites remarques :
//méthode.
void Fichier::AjoutIdentification(Identification *uneId)
{
lesIdentifications.push_back(*uneId);
}

Il est souvent préférable de passer des références
plutʹt que des pointeurs sauf dans le cas o͹ vous
considérez légitime de passer un pointeur null et, dans ce
dernier cas, il faut tester le cas o͹ le pointeur est null. Ici,
*uneId pourra donner un segmentation fault si le pointeur est null.

Identification:
//constructeur.
Identification::Identification(string unId, string unDebutId) {
this->id = unId;
this->dateDebutId=unDebutId;
this->dateBst;
this->dateFinScan;
this->error=true;
}

Il est préférable d'utiliser la construction des champs d'une
classe ainsi :
Identification::Identification(string unId, string unDebutId) :
id(unId),
dateDebutId(unDebutId),
//... ici, je ne sais pas d'o͹ viennent dateBst et dateFinScan qui
ne sont pas en paramètre du constructeur
error(true)
{}

Ainsi, cela construit les objets directement avec la bonne valeur au lieu de
les construire avec la valeur par défaut, puis leur changer leur valeur
dans le corps du constructeur.

Par ailleurs, il est souvent préférable de passer des
références sur les string (string& unId, string&
unDebutId) pour éviter une copie inutile.

--
Arnaud Meurgues


Merci beaucoup pour toutes ces explications, désoler du retard.
Pour dateBst et dateFinScan se sont des attributs qui vont être mis à jour plus tard car le but de mon programme est d'extrait des Identifications de fichiers log. Les fichiers sont lus ligne par ligne ce qui fait que je ne peux pas créer mon objet directement.
Je vous remercie encore pour votre réponse.
Poster une réponse
Anonyme