C++中如何初始化嵌套结构体?验证成员依赖赋值的正确性
C++嵌套结构体初始化合法性问题
结构体声明代码:
struct Configuration { struct ParametersSetA { float param_A_01; float param_A_02; float param_A_03; } parameters_set_A; struct ParametersSetB { float param_B_01; float param_B_02; } parameters_set_B; };
初始化代码:
Configuration config = { .parameters_set_A = { .param_A_01 = 1.0f, .param_A_02 = 2.0f, .param_A_03 = param_A_01 + param_A_02; }, .parameters_set_B = { .param_B_01 = 0.50f, .param_B_02 = 0.75f } };
问题:上述初始化方式(尤其是嵌套结构体ParametersSetA中param_A_03的赋值)在C++中是否正确?
回答:
这种初始化方式不正确,存在两个关键问题:
语法错误:
param_A_03 = param_A_01 + param_A_02;这行末尾使用了分号;,但在聚合初始化的列表中,成员初始化项之间应该用逗号,分隔,分号会直接导致编译失败,需要将分号改为逗号(最后一个初始化项可省略逗号,保持格式一致即可)。语义合法性错误:
即便修正了分号,param_A_03 = param_A_01 + param_A_02的写法依然不符合C标准。在聚合初始化过程中,初始化器的表达式不能引用同一聚合对象中正在初始化的其他成员——此时param_A_01和param_A_02属于当前正在构造的parameters_set_A实例的成员,C不允许在初始化表达式中直接使用这些尚未完成初始化的成员,编译器会抛出类似“非法使用非静态数据成员”的错误。
正确的替代方案:
直接使用常量计算结果初始化:
Configuration config = { .parameters_set_A = { .param_A_01 = 1.0f, .param_A_02 = 2.0f, .param_A_03 = 3.0f }, .parameters_set_B = {0.50f, 0.75f} };先单独初始化子结构体,再赋值给父结构体:
Configuration::ParametersSetA setA; setA.param_A_01 = 1.0f; setA.param_A_02 = 2.0f; setA.param_A_03 = setA.param_A_01 + setA.param_A_02; Configuration config = {setA, {0.50f, 0.75f}};C++20及以后版本,可以给子结构体添加构造函数,在构造逻辑中计算成员值:
struct Configuration { struct ParametersSetA { float param_A_01; float param_A_02; float param_A_03; ParametersSetA(float a1, float a2) : param_A_01(a1), param_A_02(a2), param_A_03(a1 + a2) {} } parameters_set_A; struct ParametersSetB { float param_B_01; float param_B_02; } parameters_set_B; }; // 初始化方式 Configuration config = {Configuration::ParametersSetA(1.0f, 2.0f), {0.50f, 0.75f}};
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

