如何为含预填充数组私有成员的类声明/定义构造函数
问题分析与解决方案
你的构造函数初始化写法不符合C语法规范,核心原因是内置数组无法通过初始化列表直接拷贝赋值——C的内置数组没有拷贝构造函数,不能像普通变量那样用成员(参数)的方式初始化。下面给出两种可行的解决办法:
方案1:构造函数内循环拷贝数组元素
利用数组固定大小(410)的特性,在构造函数体内逐个拷贝元素:
class Frequency_Values{ public: Frequency_Values(unsigned short LSB_LUT_[], unsigned short MSB_LUT_[]); Frequency_Values(const Frequency_Values& F); Frequency_Values& operator = (const Frequency_Values& F); ~Frequency_Values(){}; private: unsigned short MSB_LUT[410] = {1,2,3}; unsigned short LSB_LUT[410] = {1,2,3}; }; // 构造函数定义(需放在类外部) Frequency_Values::Frequency_Values(unsigned short LSB_LUT_[],unsigned short MSB_LUT_[]) { // 拷贝LSB_LUT数组元素 for (int i = 0; i < 410; ++i) { LSB_LUT[i] = LSB_LUT_[i]; } // 拷贝MSB_LUT数组元素 for (int i = 0; i < 410; ++i) { MSB_LUT[i] = MSB_LUT_[i]; } }
注意:需确保传入的参数数组至少包含410个元素,避免数组越界访问。
方案2:用std::array替代内置数组(推荐)
C++11及以后标准提供的std::array是固定大小数组的封装容器,支持直接拷贝、赋值,语法更简洁安全:
#include <array> // 必须包含头文件 class Frequency_Values{ public: // 参数改为std::array类型 Frequency_Values(const std::array<unsigned short, 410>& LSB_LUT_, const std::array<unsigned short, 410>& MSB_LUT_); Frequency_Values(const Frequency_Values& F); Frequency_Values& operator = (const Frequency_Values& F); ~Frequency_Values(){}; private: // 替换为std::array成员 std::array<unsigned short, 410> MSB_LUT = {1,2,3}; std::array<unsigned short, 410> LSB_LUT = {1,2,3}; }; // 直接用初始化列表完成初始化 Frequency_Values::Frequency_Values(const std::array<unsigned short, 410>& LSB_LUT_, const std::array<unsigned short, 410>& MSB_LUT_) : LSB_LUT(LSB_LUT_), MSB_LUT(MSB_LUT_) {}
这种方式下,拷贝构造函数和赋值运算符重载可以直接使用编译器自动生成的版本(如果没有其他自定义逻辑),无需手动编写。
额外注意:你的原始代码将构造函数定义写在了类内部的私有成员区域,这是错误的——类内部只能放成员声明,定义需移到类外部,或用inline关键字标记。
内容的提问来源于stack exchange,提问作者Dean
相关产品推荐
相关产品推荐

