Quelques fois j'ai trébuché sur le scénario où j'ai un conteneur de pointeurs qui doit être copié.C++ Comment copier correctement le conteneur (vecteur) des pointeurs?
Disons que nous avons la hiérarchie de classe suivante:
élèves (classe de base)
- Freshman (sous-classe)
- Sophmore (sous-classe)
- junior (sous-classe)
- Senior (sous-classe)
StudentService
La classe StudentService a un champ std::vector<Student*> students
et le constructeur suivant:
StudentService::StudentService(std::vector<Student*> students) {
// code
}
Il ne sera pas correct d'utiliser simplement l'opérateur std::vector::operator=
et écrire this->students = students
, parce que copiera uniquement les adresses de pointeur et si quelqu'un de l'extérieur supprime les objets pointés par ces pointeurs, la classe StudentService en souffrira.
La solution est en boucle à travers chaque pointeur dans le paramètre students
et créer un nouvel objet dynamique, quelque chose comme ceci:
for(int i = 0; i < students.size(); i++) {
this->students.at(i) = new Student(*students.at(i));
}
Mais ce n'est pas bonne en raison du fait qu'il va créer seul étudiant objets. Et nous savons qu'un étudiant peut être un étudiant de première année, Sophmore, Junior ou Senior. Alors voici ma question: quelle est la meilleure solution à ce problème?
Je suppose que d'une façon serait de placer un champ ENUM privé à l'intérieur de chaque classe d'étudiants et ont 4 instructions Sinon si vérifier quel type de l'élève est et puis créer un nouvel objet dynamique en fonction de cette façon:
for(int i = 0; i < students.size(); i++) {
if(students.at(i).getType() == FRESHMAN) {
this->students.at(i) = new Freshman(*students.at(i));
} else if(students.at(i).getType() == SOPHMORE) {
this->students.at(i) = new Sophmore(*students.at(i));
} else if {
// and so on...
}
}
Mais cela semble encore assez lourd, alors que suggérez-vous?
Oubliez le vecteur. Comment créer un 'Freshman' à partir d'un pointeur' Student'? C'est la question que vous devez rechercher sur SO. – juanchopanza
http://www.boost.org/doc/libs/1_65_1/doc/html/poly_collection.html –
Les étudiants sont-ils clonés à l'université parce qu'ils sont «utilisés» à différents endroits? –