首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ map 儲存物件導致預設建構函數缺失錯誤

     編輯:程式設計綜合問答

錯誤現象

程式碼中 std::map<int, Task> task_map_,呼叫 task_map_[t.getID()] = t 時編譯錯誤,提示 Task 缺少預設建構函數。

根本原因

map::operator[] 若鍵值不存在,會預設建構一個 Task 物件,再賦值。但 Task 類別僅定義了帶參數建構函數 Task(int id),編譯器不會自動產生預設建構函數,導致錯誤。

解決方案

  1. 新增預設建構函數(推薦):Task() : id_(0) {}。
  2. 使用 insert 或 emplace 避免預設建構:
    task_map_.emplace(t.getID(), t); // C++11 直接建構,無需預設建構函數
  3. 改用指標或智慧指標儲存:std::map<int, std::unique_ptr<Task>>,但需管理生命週期。

程式碼修正示範

class Task {
public:
    Task() : id_(0) {} // 新增預設建構函數
    Task(int id) : id_(id) {}
    // ... 其他成員 ...
};

class TaskManager {
    void addTask(const Task& t) { // 建議傳 const 參考,避免拷貝
        task_map_.emplace(t.getID(), t);
    }
    // ...
};

補充建議

  • 避免在函數參數傳遞大型物件時使用值傳遞(如 void addTask(Task t)),改用 const Task& 或右值引用。
  • 若 Task 含有虛函數,確保解構函數為 virtual。

理解 STL 容器對元件型別的要求,能有效避免此類編譯期錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved