我正在編寫一個準數據庫。爲什麼我不能打印工資?
我有一個類對:
class Pair{
MyString m_key;
Data* m_data;
}
然後,該方法的AddItem構成一對,並添加到數據庫中。
Data Ivanov(1, 10, "Manager", 100000);
Data Petrov(2, 20, "Manager", 200000);
MyString* employee0 = new MyString("Ivanov");
MyString* employee1 = new MyString("Petrov");
bd.AddItem(employee0, &Ivanov);
bd.AddItem(employee1, &Petrov);
數據庫本身監視元素的數量和容量。 Bd類{ private: int m_size; int m_capacity; Pair ** ar; ... }
如果我們添加一個項目,數據庫會在容量溢出時延長。 如果我們刪除一個項目,會出現一個空的單元格,可能在將來使用。 這樣做是爲了不將堆碎成太多。
void Bd:: AddItem(MyString* key, Data* data){
if (m_size < m_capacity){
*ar[m_size+1] = Pair(key, data);
}
else{
if (m_size == 0){
ar = new Pair*[++m_size];
m_capacity++;
ar[0] = new Pair(key, data);
stop
}
else{
Pair** tmp = new Pair*[++m_size];
m_capacity++;
memcpy(tmp, ar, m_size * sizeof(Pair*));
delete[] ar;
ar = tmp;
ar[m_size-1] = new Pair(key, data);
stop
}
}
}
void Bd::RemoveItem(const char* a_key){
Pair** tmp_ar = this->get_ar();
for (int i = 0; i < m_size; i++){
Pair* tmp_key = tmp_ar[i];
MyString* tmp_my_string= (*tmp_key).get_m_key();
const char* tmp_str = (*tmp_my_string).GetString();
if (strcmp(tmp_str, a_key) == 0){
delete ar[i];
for (int j = i; j < m_size-1; j++){
*ar[j] = *ar[j+1];
}
delete ar[m_size-1];
m_size--;
break;
}
stop
if (i == (m_size-1)){
cout << "No such person." <<endl;
}
}
stop
}
那麼,現在我要使用bd。
cout << bd;
bd.Print("Ivanov");
bd.Print("Petrov");
它完美地工作。它可以打印整個數據庫或任何元素。
然後,我刪除先生伊萬諾夫。 bd.RemoveItem(「Ivanov」);
現在我有問題,要麼這個:
bd.Print("Petrov");
cout << bd;
我有類數據的印刷方法。
void Data:: print_info(){
cout << "Sex: " << this->getSex() << ", age: " << age <<", position: " << position <<", salary: ";
cout << salary << endl;
}
我有特製的第二COUT,因爲這是我有煩惱。 工資雖然在範圍內清晰可見,但卻造成了整個問題。 請看看這張照片:
如果我讓了一步,我得到的錯誤關於堆的腐敗。 輸出窗口顯示:HEAP:免費堆塊296b30在296b58修改後釋放
您能否幫我理解爲什麼我無法打印此薪水?
我在代碼中看不到任何貓... –
通過使用免費的數據庫(如SQLite或MySql),而不是編寫自己的代碼,你會做得更好。 –
嘗試這種改變'* ar [j] = * ar [j + 1];'to'ar [j] = ar [j + 1];'RemoveItem'' – stardust