2013-05-05 31 views
1

我有兩個類,數據庫和記錄。分配運算符超載沒有被調用

class Database { 
    private: 
     Record* head; 
    public: 
     Database(Record*); 
     Database(); 
     Database(const Database&); 

     Database& operator= (const Database &data); 
}; 

class Record { 
    public: 
     Record(std::string, std::string, int, int, std::string); 
     Record(const Record&); 
     Record(); 

     Record* next; 
}; 

現在,當我做到這一點

Database PM1, PM2; 
//operations on PM1 
PM2 = PM1; 

所發生的一切是在PM1的值被分配給PM2。從不調用賦值超載。我不知道爲什麼會發生這種情況。我也嘗試過調試,但是這個功能從來沒有輸入過。我究竟做錯了什麼?

編輯:這裏是重載函數,它可能不正確,但我還沒有能夠測試它,因爲我甚至無法讓它運行。

Database& Database::operator= (const Database &data) { 
    if(this == &data) 
     return *this; 
    if(data.head == NULL) { 
     this->head = NULL; 
     return *this; 
    } 
    Record *curr1, *curr2; 
    curr1 = new Record(*(data.head)); 
    this->head = curr1; 
    for(curr2 = data.head->next; curr1 != NULL && curr2 != NULL; curr1 = curr1->next) { 
     curr1->next = new Record(*curr2); 
     curr2 = curr2->next; 
    } 
    return *this; 
} 
+0

你怎麼知道你的賦值操作符從來沒有被調用? – 2013-05-05 18:07:21

+0

你不是在調試發佈版本嗎? – 2013-05-05 18:08:13

+0

代碼看起來是正確的,如果它確實如它在這裏所示。我會嘗試清理和重建程序。還要在賦值之前添加一個記錄/斷點,賦值運算符內的另一個記錄並運行以查看它是否碰到該行。這可能是與任務線沒有達成! – 2013-05-05 18:12:22

回答

0

我想是因爲你在你的數據庫類具有指針,我猜你沒有處理,你認爲你重載操作量無法正常工作。 你做淺拷貝。所以你需要處理!

+0

所以如果班上有一個指針,它只是做一個淺拷貝?我如何讓它過載?我有指針在重載處理,所以它不像我只是設置指針平等,然後獲得相同的引用。有什麼具體的我應該做的處理指針? – mrobinson7627 2013-05-05 18:44:11

+0

看這個頁面你會發現所有。 http://www.learncpp.com/cpp-tutorial/912-shallow-vs-deep-copying/ – Aryan 2013-05-05 19:02:17

+0

@ mrobinson7627你的代碼看起來不錯。我不知道這個答案試圖告訴你什麼,但它可以讓作者很好地閱讀這個問題和發佈的代碼。你對賦值操作符和拷貝構造函數的重載正是你應該做的動作成員和遵守三法則(儘管你似乎錯過了清理那些成員的虛擬析構函數,但那是另一個問題)。其他的一定是錯誤的,因爲你似乎正在做這件事。 – WhozCraig 2013-05-05 19:17:56

0

對象可能需要事先實例化才能調用複製分配函數。

// So instead of doing this: 
Database PM1, PM2; 
PM2 = PM1; 

// Try this: 
Database *PM1 = new Database(); 
Database *PM2 = new Database(); 
*PM2 = *PM1;