C++ grid结构体语法疑问:生命游戏作业代码解析求助
关于C++生命游戏作业中两处语法的疑问解答
嘿,我来帮你拆解这两个C++语法点,都是面向对象编程里很基础但关键的内容,咱们一个个来:
1. 构造函数里的冒号和new数组语法
先看构造函数的这段代码:
grid(int scale) : scale_(scale), width_(problem_definition::width(scale)), height_(problem_definition::height(scale)), data_(new problem_definition::data_type[width_*height_]) { }
- 冒号的含义:这是C++的成员初始化列表,用来在构造函数体执行之前,直接初始化类/结构体的成员变量。相比在构造函数体内给成员赋值(比如
scale_ = scale;),初始化列表效率更高——尤其是对于const成员、引用类型成员,或者没有默认构造函数的类成员,必须用初始化列表来初始化。这里就是一次性把scale_、width_、height_和data_都初始化好,避免额外的赋值操作。 new后的方括号:new problem_definition::data_type[width_*height_]是动态分配数组的语法。problem_definition::data_type是数组元素的类型,width_*height_是数组的长度(也就是网格的总元素数)。这个表达式会在堆上创建一个包含width_*height_个data_type元素的数组,返回数组第一个元素的指针,然后把这个指针赋值给data_(注意data_的类型是std::unique_ptr<problem_definition::data_type[]>,专门用来管理动态数组的智能指针,和数组类型的new完美匹配)。
2. initialize()函数中的at(x,y)是什么
at(x,y)是grid结构体自己定义的成员函数重载,看代码里有两个版本:
- 第一个版本(用来修改元素):
这个函数接收网格的坐标problem_definition::data_type& at(std::size_t x, std::size_t y) { return data_[x + y*width_]; }(x,y),通过计算x + y*width_把二维坐标转换成一维数组的索引(因为data_是一维数组,用来存储二维网格的数据),然后返回对应元素的引用——所以你可以直接用at(x,y) = ...来修改这个位置的值,这就是initialize()里做的事情:调用problem_definition::initialize()生成初始值,然后赋值给网格的(x,y)位置。 - 第二个版本(用来获取邻居元素):
这个版本多了偏移量problem_definition::data_type at(std::size_t x, std::size_t y, int dx, int dy) { // 边界检查逻辑... return at((int)x + dx, (int)y + dy); }dx和dy,用来获取(x,y)周围的邻居元素(比如生命游戏里需要统计周围活细胞数量),同时做了边界检查,如果超出网格范围就返回out_of_bounds_value()。
完整的grid结构体代码
struct grid { grid(int scale) : scale_(scale), width_(problem_definition::width(scale)), height_(problem_definition::height(scale)), data_(new problem_definition::data_type[width_*height_]) { } void initialize() { for (std::size_t y = 0; y < height_; ++y) { for (std::size_t x = 0; x < width_; ++x) { at(x,y) = problem_definition::initialize(x, y, scale_); } } } problem_definition::data_type at(std::size_t x, std::size_t y, int dx, int dy) { if (dx<0 && -dx>x) return problem_definition::out_of_bounds_value(); if (dy<0 && -dy>y) return problem_definition::out_of_bounds_value(); if (x + dx >= width_) return problem_definition::out_of_bounds_value(); if (y + dy >= height_) return problem_definition::out_of_bounds_value(); return at((int)x + dx, (int)y + dy); } problem_definition::data_type& at(std::size_t x, std::size_t y) { return data_[x + y*width_]; } void swap(grid& other) { std::swap(scale_, other.scale_); std::swap(width_, other.width_); std::swap(height_, other.height_); std::swap(data_, other.data_); } void print(std::ostream& str) { for (std::size_t y = 0; y < height_; ++y) { for (std::size_t x = 0; x < width_; ++x) { str << at(x, y); } str << std::endl; } } private: int scale_; std::size_t width_; std::size_t height_; std::unique_ptr<problem_definition::data_type[]> data_; };
内容的提问来源于stack exchange,提问作者BorbonJuggler
相关产品推荐
相关产品推荐

