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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:14:43