1

theta基本的に、別のクラスメンバーによって初期化されるが適切に初期化される非静的メンバー。次に、ご覧のvalley_maxとおりによって初期化さthetaれます。現在、すべてが正常に機能しています。次に、境界が である配列を初期化しますvalley_max。まず、エラーが発生しました:

非静的データ メンバーの無効な使用

その後、ご覧のとおり追加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];
}
4

2 に答える 2

2

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

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

たとえば、あなたの場合thetaはの detected_rangeに初期化され、後者は の評価で使用する時点で初期化されていないため、thetaコードの動作は未定義です!

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

于 2016-12-16T10:15:10.360 に答える
0

別のメンバー変数によって初期化されたメンバー変数によって初期化された境界を持つ配列を初期化できるかどうか疑問に思っています。

いいえ、あなたがすることはできません。

そのような変数は

整数定数ではありません

エラーメッセージが言うように。メンバー変数の値はコンパイル時に不明です。これは、配列のサイズがコンパイル時に一定でなければならない (つまり、コンパイル時に既知である) という要件と矛盾します。

解決策:std::vector代わりに a を使用します。ベクトルのサイズは、コンパイル時にロックされません。

于 2016-12-16T10:16:34.050 に答える