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

类构造函数中初始化vector嵌套字符矩阵报错,求解决方法

问题分析与解决

错误原因拆解

咱们来一步步揪出问题所在:

  1. 指针访问方式错误:你的matrix是vector<vector<char>>*类型的指针,直接写this->matrix[i][j]完全搞错了访问逻辑。matrix[i]等价于*(matrix + i),这会让指针往后偏移i个vector<vector<char>>的内存块,而不是访问指针指向的那个二维容器的第i行。正确的姿势应该是先解引用指针,再访问元素:(*this->matrix)[i][j]。

  2. resize参数类型不匹配:初始化每行时你写了this->matrix[i].resize(this->row, vector<char>(row));,这里resize的第二个参数类型完全不对。因为matrix的每一行是vector<char>,resize的第二个参数应该是char类型的初始值,而不是一个vector<char>对象。这行代码其实已经埋下了隐患,只是在赋值空格的时候才彻底暴露错误。

修正后的构造函数代码

下面是修正了所有错误的版本,直接就能正常运行:

Game::Game() {
    this->col = 20;
    this->row = 20;
    // 初始化二维vector:先创建包含col行的空容器
    this->matrix = new vector<vector<char>>(this->col);
    for(int i = 0 ; i < this->col ; i++) {
        // 将每行resize为row个元素,同时把每个元素初始化为空格
        (*this->matrix)[i].resize(this->row, ' ');
    }
    // 这里不需要额外循环赋值了,resize时已经指定了初始值为' '
    // 如果坚持手动赋值,就用下面的循环:
    // for(int i = 0 ; i < this->col; i++)
    //     for(int j = 0 ; j < this->row ; j++)
    //         (*this->matrix)[i][j] = ' ';
}

更优建议:抛弃裸指针,直接用容器

在C++里,除非必须使用指针的场景,尽量别用裸指针管理容器。你可以直接把matrix定义为vector<vector<char>>类型,既不用手动操心内存泄漏,代码也简洁太多:

修改game.h的私有成员:

private:
    int row;
    int col;
    vector<vector<char>> matrix; // 去掉指针
    // other attributes

对应的构造函数(一行搞定初始化):

Game::Game() : col(20), row(20), matrix(col, vector<char>(row, ' ')) {
    // 初始化列表直接完成所有工作,连循环都省了
}

这样一行代码就创建了20行20列的二维字符矩阵,每个元素默认都是空格,简洁又安全。

内容的提问来源于stack exchange,提问作者Carlos A. Jimenez Holmquist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:49:42