我有一個任務,我們需要使用向量和類的基本結構來了解父類和子類以及多型性。這是我應該撰寫的函式的代碼:
void assignStudents(vector<Student*>& v) {
for (int i = 0; i < 5; i )
{
cout << "Enter a study level: ";
string input;
cin >> input;
if (input == "graduate")
{
Graduate inputClass;
Student* inputParentClassPtr = &inputClass;
v.push_back(inputParentClassPtr);
v[i]->addToVector(input);
inputParentClassPtr = nullptr;
}
else if (input == "undergraduate")
{
Undergraduate inputClass;
Student* inputParentClassPtr = &inputClass;
inputParentClassPtr->addToVector(input);
v.push_back(inputParentClassPtr);
}
else
{
cout << "Please enter a valid response, either graduate or undergraduate" << endl;
i--;
}
}
for (size_t i = 0; i < v.size(); i )
{
vector<string> studyLevels = v[i]->getStudyLevels();
size_t size = studyLevels.size();
for (int j = 0; j < size; j )
{
cout << studyLevels[j];
}
}
}
我除錯程式,每次第一個for回圈進入下一次迭代時,我的每個物件中的每個成員變數都會vector變為空白,但是當我將新物件添加到 中時vector,然后呼叫addToVector()它們回傳的函式。
我添加了底部for回圈以檢查是否正在進行任何編輯,一旦我到達底部for回圈,每個成員變數都會再次為空。
我有我要添加的Student課程和課程。每個類都有一個受保護的內部稱為. 我需要將類添加到包含所有物件的類中,然后編輯成員變數以包含表示它所在型別別的字串。vectorUndergraduateGraduateStudentvectorlevelsvectorvector
為什么levels每次完成回圈迭代時成員變數()都會變為空白for?
uj5u.com熱心網友回復:
我將只關注一個部分,因為相同的問題在您的代碼中出現了兩次。
{
Graduate inputClass; // create local student "on the stack"
Student* inputParentClassPtr = &inputClass;
v.push_back(inputParentClassPtr); // store address of student
v[i]->addToVector(input);
inputParentClassPtr = nullptr; // has no real effect
} // inputClass goes out of scope and is destroyed here
當塊結束時,該塊中的本地“堆疊”變數被銷毀。這意味著該Graduate物件不再有效,并且您存盤的指標v現在指向不可用的東西。
要解決這個問題,您需要在動態記憶體中創建物件。
您應該將向量更改為 store std::unique_ptr<Student>,并使用 創建物件std::make_unique(),如下所示:
auto inputParentClassPtr = std::make_unique<Graduate>();
v.push_back(std::move(inputParentClassPtr));
但是,如果你不能這樣做,你將需要使用new,像這樣:
Student* inputParentClassPtr = new Graduate();
v.push_back(inputParentClassPtr);
無論哪種方式,即使inputParentClassPtr在塊的末尾仍然被銷毀,它只是一個指標,Graduate它指向的物件仍然是活動的。
如果您使用new,則在使用完向量中的所有物件后,您將需要delete它們,否則您將發生記憶體泄漏。使用std::unique_ptr將為您處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/441471.html
上一篇:OpenMp警告:忽略#pragmaopmparallel
下一篇:c 參考二維陣列函式的問題
