如何向类构造函数传递数组并存储?解决数组边界未指定错误
解决数组传递给类构造函数并存储的问题
你遇到的invalid use of array with unspecified bounds错误,核心原因有两个:
- C++不允许直接对数组进行赋值操作,函数参数里的
byte matrix[]会被编译器自动退化为byte*指针,但类成员byte _matrix[]属于不完整类型,无法直接用来存储数组。 - 直接赋值数组的操作在C++里本身就是不允许的。
下面给你三种可行的解决方法:
方法一:用指针存储(需注意数组生命周期)
把类成员改成指针,同时额外存储数组长度避免越界访问。这种方式只是存储原数组的指针,所以原数组不能提前被销毁,否则会出现悬空指针问题。
byte matrix[] = { HIGH, LOW, HIGH }; const int MATRIX_SIZE = sizeof(matrix)/sizeof(matrix[0]); // 计算数组长度 sources[0] = new Source("test", matrix, MATRIX_SIZE); class Source { public: Source(); Source(String id, byte* matrix, int size); private: String _id; byte* _matrix; int _size; // 记录数组长度,防止越界 }; Source::Source() : _matrix(nullptr), _size(0) {} Source::Source(String id, byte* matrix, int size) { _id = id; _matrix = matrix; _size = size; }
方法二:用std::array(固定大小数组场景)
如果你的数组大小是固定的,用std::array是最安全的选择,它支持直接赋值,会完整复制数组内容,不用担心生命周期问题:
#include <array> std::array<byte, 3> matrix = { HIGH, LOW, HIGH }; sources[0] = new Source("test", matrix); class Source { public: Source(); Source(String id, const std::array<byte, 3>& matrix); private: String _id; std::array<byte, 3> _matrix; }; Source::Source() {} Source::Source(String id, const std::array<byte, 3>& matrix) { _id = id; _matrix = matrix; // 直接赋值std::array对象 }
方法三:用std::vector(动态大小数组场景)
如果数组大小不确定或者需要动态调整,std::vector是最佳方案,它会自动管理内存,支持灵活的扩容和赋值:
#include <vector> byte matrix[] = { HIGH, LOW, HIGH }; // 将普通数组转为vector std::vector<byte> vec_matrix(matrix, matrix + sizeof(matrix)/sizeof(matrix[0])); sources[0] = new Source("test", vec_matrix); class Source { public: Source(); Source(String id, const std::vector<byte>& matrix); private: String _id; std::vector<byte> _matrix; }; Source::Source() {} Source::Source(String id, const std::vector<byte>& matrix) { _id = id; _matrix = matrix; // 直接赋值vector }
内容的提问来源于stack exchange,提问作者Martin Nilsson
相关产品推荐
相关产品推荐

