C++构造函数向std::list<Currency>加对象报push_back参数不匹配错误
报错根因
你定义的全局列表std::list<Currency> CurrencyList存储的是Currency类对象值,而类成员函数中的this是指向当前实例的Currency*指针类型,两者类型不匹配,因此push_back调用找不到对应函数报错。
解决方法(二选一,推荐方案1)
方案1:修改列表存储类型为指针(符合币种管理需求,避免数据不同步)
这种方案列表中存储的是每个币种实例的指针,后续修改实例属性时列表中的数据会同步更新,适合你的钱包业务场景。
- 修改
Currency.h中的全局列表声明:
// 替换原来的extern std::list<Currency> CurrencyList; extern std::list<Currency*> CurrencyList;
- 在
Currency.cpp的全局作用域(include语句之后,函数定义之前)添加全局变量的定义:
std::list<Currency*> CurrencyList;
- 原有构造函数中的
CurrencyList.push_back(this);无需修改,类型完全匹配。
提示:如果你的币种实例都是全局常驻、不会提前销毁的,不需要额外处理指针释放问题;如果有动态删除币种的需求,记得删除实例前先从列表中移除对应指针,避免野指针。
方案2:不修改列表类型,存入对象拷贝
如果你确认需要列表存储独立的对象副本,直接修改构造函数中的push_back语句即可:
// 替换原来的CurrencyList.push_back(this); CurrencyList.push_back(*this);
提示:这种方案列表中存储的是当前构造对象的拷贝,后续你修改原实例的属性时,列表中的副本不会同步更新,大概率不符合你的业务需求,不推荐使用。
其他附带问题修正
你的代码还有几处隐藏问题,建议一并修复避免后续报错:
buyFrom、sellBack函数声明了float返回值类型,但实际没有return语句,会触发未定义行为。要么添加return left_over;语句,要么把返回值类型改为void。- 成员函数中访问成员变量不需要加
Currency::前缀,直接写id、coinName即可。 - 注意头文件名大小写统一,你的头文件命名为
Currency.h,Currency.cpp中include写的是"currency.h",在大小写敏感的系统(如Linux)下会编译失败。
内容的提问来源于stack exchange,提问作者001brandon
相关产品推荐
相关产品推荐

