如何使用类的属性创建固定大小的数组?
类内用变量值确定数组长度的实现方案
错误原因
- 你的代码存在两个核心问题:
- C++中内置静态数组的长度必须是编译期可确定的常量表达式,你声明的
const static int m_RADIUS只有声明没有类内初始值,编译阶段无法获取它的具体数值,自然无法计算数组长度。 - 数组声明缺少变量名,本身语法不合法。
- C++中内置静态数组的长度必须是编译期可确定的常量表达式,你声明的
解决方案
场景1:数组大小全局固定,编译期就能确定
直接给m_RADIUS添加类内编译期初始值即可,C++11及以上版本推荐用constexpr明确标识编译期常量,代码示例如下:
#include "tile.h" class board { private: // 类内给编译期可见的初始值,示例值为10,可替换为你需要的实际半径 constexpr static int m_RADIUS = 10; // 补全数组变量名m_tiles,此时长度是编译期可计算的常量 static tile m_tiles[2 * m_RADIUS - 1][2 * m_RADIUS - 1]; }; // 静态成员需要在类外完成定义,类内只是声明 tile board::m_tiles[2 * board::m_RADIUS - 1][2 * board::m_RADIUS - 1];
如果使用C03标准,把constexpr替换为const即可,C03已经支持类内初始化const静态整型成员。
场景2:数组大小需要运行时动态指定,不同实例可以有不同半径
这种情况不能用静态数组,改用标准库的std::vector动态容器即可,无需手动管理内存,代码示例如下:
#include "tile.h" #include <vector> class board { private: int m_RADIUS; std::vector<std::vector<tile>> m_tiles; public: // 构造函数传入半径,初始化vector的尺寸 explicit board(int radius) : m_RADIUS(radius), m_tiles(2 * radius - 1, std::vector<tile>(2 * radius - 1)) {} };
内容的提问来源于stack exchange,提问作者LouisB
相关产品推荐
相关产品推荐

