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.
};
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 :
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.
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
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() {}
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.
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.
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 :
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.
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
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 :
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.
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.
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.
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 :
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.
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.