You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:24:03