如何重载operator>>运算符实现类内vector成员的数值输入?
问题原因及解决方案
你代码的报错是由多处语法、逻辑错误共同导致的,具体问题及修复方案如下:
- 构造函数写法错误:你在构造函数内部定义了局部变量
vector<int> numbers = {},并没有对类的私有成员numbers做初始化操作,实际上vector默认构造函数会自动生成空实例,这行冗余代码可以直接删除。 - 输入运算符参数错误:
operator>>需要修改传入的List类成员,第二个参数不能加const修饰,否则无权修改类内成员。 - 变量命名冲突:
operator>>的输入流参数命名为i,循环内又定义了同名的int循环变量i,导致循环内的i被覆盖为整型变量,无法调用输入流功能。 - vector未扩容直接访问越界:输入长度
help后,你没有给numbersvector分配对应容量,空vector直接用at(i)访问下标必然抛出越界异常,需要先调用resize(help)扩容,或者使用push_back方法新增元素。
修复后可运行代码
#include <iostream> #include <vector> using namespace std; class List { private: vector<int> numbers; public: // 移除冗余的错误构造代码,使用默认构造即可 friend istream& operator>>(istream& is, List& l); // 补充简易输出重载方便验证结果,不需要可以删除 friend ostream& operator<<(ostream& os, const List& l) { for (int num : l.numbers) { os << num << " "; } return os; } }; istream& operator>>(istream& is, List& l) { int help{ 0 }; is >> help; // 先给vector扩容到对应长度 l.numbers.resize(help); // 修改变量名避免冲突 for (int idx{ 0 }; idx < help; idx++) { is >> l.numbers.at(idx); } return is; } int main() { List list; cin >> list; cout << list << endl; return 0; }
内容的提问来源于stack exchange,提问作者PrOfSeS
相关产品推荐
相关产品推荐

