有幾次我偶然發現了需要複製的指針容器。C++如何正確地複製指針的容器(向量)?
比方說,我們有下面的類層次結構:
學生(基類)
- 大一(子類)
- Sophmore(子類)
- 少年(子類)
- 高級(小類)
StudentService
的StudentService類有一個std::vector<Student*> students
場和下面的構造:
StudentService::StudentService(std::vector<Student*> students) {
// code
}
這不會是正確的,只是使用std::vector::operator=
操作和寫this->students = students
,因爲只會複製指針地址,所以如果外部的某個人刪除了這些指針所指向的對象,那麼StudentService類就會因此受到影響。
解決的辦法是遍歷在students
參數每個指針,並創建一個新的動態對象,像這樣:
for(int i = 0; i < students.size(); i++) {
this->students.at(i) = new Student(*students.at(i));
}
但即使是不正確的,由於事實,即它只能建立學生對象。我們知道一個學生可以成爲新生,Sophmore,初中或高中。所以這是我的問題:什麼是這個問題的最佳解決方案?
我想一個辦法是將每個學生類中的私有枚舉場,並有4 if-else語句檢查它是什麼類型的學生,然後創建一個基於像這樣一個新的動態對象:
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...
}
}
但是,這仍然看起來很繁瑣,所以你會建議什麼?
忘記載體。你將如何從'Student'指針創建一個'Freshman'?這是您需要在SO上搜索的問題。 – juanchopanza
http://www.boost.org/doc/libs/1_65_1/doc/html/poly_collection.html –
由於學生在不同的地方被「使用」,學生是否在你的大學克隆? – 2017-10-10 15:39:38