C++自定义BigInt大整数类重载输入运算符>>的实现问题
第一步:先修正头文件中的友元声明错误
你当前头文件里的>>运算符友元声明完全错误,输入运算符第一个参数是输入流std::istream,第二个参数是要修改的Bigint对象(不能加const),替换原声明行:
// 删掉原来错误的这行:friend std::ostream& operator>> (std::ostream& out, const Bigint& n); // 替换为: friend std::istream& operator>> (std::istream& in, Bigint& n);
第二步:实现>>运算符重载
逻辑和你已有的赋值运算符逻辑对齐:输入的数字从低位到高位逆序存入number数组,同时处理非法输入、长度越界等边界情况,cpp实现代码如下:
#include <ios> // 要用到流状态常量 std::istream& operator>> (std::istream& in, Bigint& n) { // 先清空数组所有位为0,避免原有数据干扰 for (int i = 0; i < n.digits; i++) { n.number[i] = 0; } char c; char temp_buf[BIGINT_SIZE] = {0}; // 临时存储输入的数字序列 int input_len = 0; // 跳过输入前置的空白字符 in >> std::ws; // 逐个读取数字字符 while (input_len < n.digits && in.get(c)) { if (c < '0' || c > '9') { // 遇到非数字停止读取,把字符放回输入流 in.putback(c); break; } temp_buf[input_len++] = c - '0'; // 字符转数值存入临时数组 } // 没有读到有效数字,设置输入流失败状态 if (input_len == 0) { in.setstate(std::ios::failbit); return in; } // 把临时数组的数字倒序存入Bigint的number数组,和你的赋值运算符存储逻辑完全对齐 int num_ptr = n.digits - 1; for (int i = input_len - 1; i >= 0; i--) { n.number[num_ptr--] = temp_buf[i]; } return in; }
额外兼容优化建议
你的Bigint类当前只重载了赋值运算符,没有自定义拷贝构造函数,类内有堆内存指针number,默认生成的浅拷贝构造函数会导致加法运算符返回临时对象时出现内存重复释放的野指针问题,建议补充拷贝构造函数:
// 头文件public区添加声明 Bigint(const Bigint& n); // cpp文件实现 Bigint::Bigint(const Bigint& n) { digits = n.digits; number = new char[digits]; for (int i = 0; i < digits; i++) { number[i] = n.number[i]; } }
内容的提问来源于stack exchange,提问作者That_Guy989
相关产品推荐
相关产品推荐

