Money类转Int失败,出现'int'转'Money'编译错误求助
解决Money类与int转换编译错误及赋值运算符重载问题
咱们先把你遇到的问题拆解清楚,一步步来解决:
首先,核心的编译错误 'initializing': cannot convert from 'int' to 'Money'(出现在genericarray.h第13行),大概率是这两个原因之一:
- 你的
genericArray::sum()方法返回了int类型,但你把它赋值给了Money类型的total成员; - 在
genericArray的构造函数或其他方法里,你试图用int直接初始化Money对象,但Money类没有对应的转换逻辑。
另外你的main()里还有个小问题:m1和m2根本没定义就直接用了,这也会触发编译错误,咱们后面一起修。
第一步:修复int与Money的转换错误
方案1:让sum()返回Money类型(最合理的做法)
既然sum()是计算多个Money对象的总和,那它的返回值就该是Money,而不是int。修改genericArray的sum()方法:
template <typename T> T genericArray<T>::sum() { T total; // 这里需要Money有默认构造函数,用来初始化总和的初始值 for (int i = 0; i < size; ++i) { total += elements[i]; // 这一步要求Money重载了+=运算符,后面会讲 } return total; }
如果你的Money还没有默认构造函数,记得补上:
class Money { private: int dollars; int cents; public: // 默认构造函数,初始化0美元0美分 Money() : dollars(0), cents(0) {} // 你已有的构造函数 Money(int d, int c) : dollars(d), cents(c) {} // ...其他成员 };
方案2:给Money添加int转换构造函数(仅当业务需要时用)
如果确实需要把int直接转成Money(比如int代表美元数,美分默认0),可以给Money加一个转换构造函数:
class Money { // ...其他成员 public: // explicit关键字避免隐式转换,更安全 explicit Money(int d) : dollars(d), cents(0) {} };
用了explicit的话,需要转换时得显式写Money(10),如果去掉explicit,编译器会自动帮你做隐式转换,但可能带来意外问题,建议保留。
第二步:补全Money的赋值运算符重载
如果你的Money类没有动态分配内存,编译器其实会自动生成默认的赋值运算符,但如果需要自定义逻辑(比如美分超过99自动进位),可以手动重载成这样:
class Money { // ...其他成员 public: // 拷贝赋值运算符 Money& operator=(const Money& other) { // 先检查自赋值,避免不必要的操作 if (this == &other) { return *this; } // 拷贝数据 dollars = other.dollars; cents = other.cents; // 可选:如果需要处理美分进位,在这里加逻辑 if (cents >= 100) { dollars += cents / 100; cents %= 100; } return *this; } // 如果需要支持移动赋值(比如用临时对象赋值时更高效),可以再加这个 Money& operator=(Money&& other) noexcept { if (this == &other) { return *this; } dollars = other.dollars; cents = other.cents; // 重置源对象,避免野指针(这里Money没有动态内存,可选) other.dollars = 0; other.cents = 0; return *this; } };
第三步:修复main()函数的问题
先把未定义的m1、m2补上,另外如果genericArray的elements是私有成员,直接访问m3.elements[i]会报错,建议给genericArray加个设置元素的方法,比如setElement:
// 先给genericArray加成员函数 template <typename T> class genericArray { private: T* elements; int size; public: // ...其他成员 void setElement(int index, const T& val) { if (index >= 0 && index < size) { elements[index] = val; } // 可选:加越界判断逻辑 } }; // 然后修改main() int main() { genericArray<Money> m1(3); // 初始化一个容量为3的数组 genericArray<Money> m2(4); // 初始化一个容量为4的数组 genericArray<Money> m3(5); Money d(-1, 89); Money a(10, 5); Money b(10, 5); Money c(43, 7); Money k(50, 6); Money m(10, 20); Money bonus(5, 0); // 用setElement代替直接访问elements m3.setElement(0, a); m3.setElement(1, b); m3.setElement(2, c); m3.setElement(3, k); m3.setElement(4, m); m3.total = m3.sum(); m2.total = m2.sum(); m1.total = m1.sum(); return 0; }
额外必做:给Money重载+或+=运算符
要让sum()里的累加正常工作,必须给Money重载+或+=运算符,比如:
class Money { // ...其他成员 public: // 重载+运算符 Money operator+(const Money& other) const { int totalDollars = dollars + other.dollars; int totalCents = cents + other.cents; // 处理美分进位 totalDollars += totalCents / 100; totalCents %= 100; return Money(totalDollars, totalCents); } // 重载+=运算符,复用+的逻辑 Money& operator+=(const Money& other) { *this = *this + other; return *this; } };
内容的提问来源于stack exchange,提问作者Tunti
相关产品推荐
相关产品推荐

