2016-12-16 6 views
1

基本的に、非スタティックメンバthetaは別のクラスメンバによって初期化されますが、初期化されます。その後、thetaによって初期化されたvalley_maxがわかります。今はすべて正常に動作します。次に、バインドが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]; 
} 

答えて

2

あなたの特定の問題は、可変長配列は、C++でサポートされていないという事実によるものです。代わりにstd::vectorまたは別のC++標準ライブラリコンテナを使用することを検討してください。

しかし、あなたはさらに問題(私の意見では、あなたの質問は興味深い)があります。メンバーの初期化の順序は、彼らがクラス定義に現れる順序で、ない彼らは初期設定で表示される順序を。

たとえば、あなたのケースでthetadetected_rangeを初期化され、そして後者はあなたがthetaの評価にそれを使用する時点で初期化されていないので、あなたのコードの動作は未定義です!

あなたの場合、メンバーがconstである必要がない限り、私はあなたの場合はコンストラクタ本体にリテラルに設定されていないものを初期化します。

0

他のメンバー変数で初期化されたメンバー変数で初期化された境界を初期化できるかどうかは疑問です。

いいえ、できません。

あなたがすることはできません、エラーメッセージが言うように、このような変数は

ない整数定数

ですので。メンバ変数の値はコンパイル時には不明です。これは、配列のサイズがコンパイル時定数(コンパイル時に既知)でなければならないという要件に反します。

解決方法:代わりにstd::vectorを使用してください。コンパイル時には、ベクトルのサイズはロックされません。

関連する問題