C++生命游戏项目:重载运算符索引无法输出值求助
问题分析与解决
嘿,我一眼就揪出问题根源了!咱们一步步拆解来看:
核心问题:整数与字符的类型混淆
你在主函数里的赋值代码是这样的:
grid(6,1) = 1; grid(5,1) = 1;
这里的1是整数类型,但你的currentCells是std::vector<char>——当把整数1赋值给char变量时,它会被解释为ASCII码值1,而这个ASCII字符是不可打印的控制字符(SOH,标题开始符),所以执行std::cout << grid(6,1)时,控制台不会显示任何可见内容,这完全匹配你描述的现象。
另外,你的operator<<重载里还有个小偏差:不管存的是什么非空格字符,都统一输出'0',这也和你预期显示1的需求不符。
修复步骤
1. 修正赋值语句,使用字符字面量
把主函数里的整数赋值改成字符'1':
grid(6,1) = '1'; grid(5,1) = '1';
2. 调整operator<<的输出逻辑
原来的代码硬编码把非空格字符输出为'0',我们改成直接输出存储的字符,让显示和存储一致:
std::ostream& operator<<(std::ostream& os, const World &rhs) { os << "timestep " << rhs.timestep << "\n"; headerLine(os, rhs); for (auto i = 0; i < rhs.height; i++) { os << "|"; for (auto j = 0; j < rhs.width; j++) { // 直接输出存储的字符,替代硬编码的'0' os << rhs.currentCells[j + (i * rhs.width)]; } os << "|\n"; } headerLine(os, rhs); return os; }
如果你希望非空格字符统一显示为'0',那赋值时就用'0'即可,保持逻辑一致就行。
3. (可选)优化索引调用,让代码更简洁
你已经实现了index函数和operator()重载,但在operator<<里还是手动计算索引,其实可以直接调用rhs(j, i)(注意坐标顺序:i是行y,j是列x),代码更简洁也更不易出错:
for (auto j = 0; j < rhs.width; j++) { os << rhs(j, i); }
修复后的预期输出
运行修改后的代码,控制台会输出:
timestep 0 +----------+ | | | 11 | | | | | | | +----------+ (6, 1) = 1
完全符合你的预期!
内容的提问来源于stack exchange,提问作者dane_griffiths
相关产品推荐
相关产品推荐

