C++初始化类成员变量取决于其他成员变量

问题描述:

基本上,非静态成员theta由另一个类成员初始化,但已初始化。然后你可以看到valley_maxtheta初始化。现在一切正常。然后我想初始化一个数组,其边界是valley_max。首先,我得到了错误:C++初始化类成员变量取决于其他成员变量

无效使用非静态数据成员的

然后,添加static const int valley_max,你可以看到。但是我有错误等:

阵列边界不是一个整数之前常数“]”令牌

我只是想知道如果我可以初始化其通过由另一个初始化的成员变量绑定初始化所述阵列成员变量。
感谢您的帮助。

AP_Tmxk_VFH.cpp

AP_Tmxk_VFH::AP_Tmxk_VFH() : 
    l(5), 
    threshold(5), 
    safe_space(0.7), 
    detected_range(2.5), 
    theta(degrees(acos(1-sq(safe_space)/(2*sq(detected_range))))), 
    valley_max(round_float(180.0/theta)), 
    valley_count(0), 
{ 
} 

AP_Tmxk_VFH.h

class AP_Tmxk_VFH { 
privte: 
     int l; 
     int threshold; 
     int safe_space; 
     int theta; 
     int detected_range; 
     static const int valley_max ; 
     struct{ 

     bool inside_valley = false; 
     uint16_t up_bound = 0; 
     uint16_t down_bound = 0; 
    }valley[valley_max]; 
} 

你的具体问题是由于一个事实,即变长数组不是在C++的支持。考虑使用std::vector或其他C++标准库容器。

但是你有进一步的问题(这在我看来,使你的问题有趣):成员初始化的顺序是它们出现在类定义的顺序,它们出现在初始化的顺序。

例如,你的情况是thetadetected_range之前初始化,并且因为后者不是在你使用它的theta评价点初始化代码的行为是不确定的!

就你而言,除非你需要成员为const,否则我会在构造函数体中初始化那些未设置为文字的元素,如果我是你的话。

我只是想知道我是否可以初始化由其他成员变量初始化的成员变量初始化绑定的数组。

不,你不能。

你不能,因为这样的变量是

不是一个整数常量

像错误消息说。成员变量的值在编译时是未知的 - 这与要求数组的大小必须是编译时间常数(即在编译时已知)相矛盾。

解决方案:改为使用std::vector。矢量的大小在编译时不锁定。