0

私の構造には次の定義があります。

struct localframevelo
{
    double ivelo; //i(x) component of velocity
    double cvelo; //c(y) component of velocity
    double rvelo; //r(z) component of velocity
    double speed; //total magnitude of velocity

    localframevelo()
    {
        ivelo = 0;
        cvelo = 0;
        rvelo = 0;
        speed = 0;
    }
    localframevelo(double init_ivelo, double init_cvelo, double init_rvelo)
    {
        ivelo = init_ivelo;
        cvelo = init_cvelo;
        rvelo = init_rvelo;
        speed = sqrt(pow(ivelo, 2.0) + pow(cvelo, 2.0) + pow(rvelo, 2.0));
    }
};

これは、localframeveloのデフォルトコンストラクターを使用しようとしているクラスです。

    class missionprofile
    {
    //misison waypoints structure************************
    private:
        double stdholdtime; // 0.25 second within tolerance radius to "reach" a waypoint
        double stdtolrad; // 0.5 meter tolerance radius (error magnitude) to "be at" a waypoint
        localframevelo stdvelo;
        waypoint missionwaypoints[MAXLISTLENGTH];
        int numwaypoints;

    public:
        missionprofile();
        missionprofile(int points, double StdHoldTime, double StdTolRadius, localframevelo StdVelo);

};

これは、localframeveloのデフォルトコンストラクターを呼び出そうとしているクラスのデフォルトコンストラクターの実装です。

missionprofile::missionprofile()
{
    numwaypoints = 0;
    stdholdtime = 0;
    stdtolrad = 0;
    stdvelo();          //ERROR
}

このエラーが発生します。適切なoperator()を使用せずにクラス型のオブジェクトを呼び出すか、関数へのポインタ型への変換関数を使用します。mbedコンパイラを使用していますが、コードの何が問題になっていますか?

4

2 に答える 2

1

この行は安全に削除できます。

stdvelo();   

operator()()関数本体のコンテキストでは、これは、初期化ではなく、のインスタンスの呼び出しとして解釈されlocalframeveloます。データメンバーは、明示的な初期化なしで、とにかくデフォルトで構築されます。しかし、実際に行うべきことは、コンストラクターの初期化リストでデータメンバーを初期化することです。

missionprofile::missionprofile() 
  : numwaypoints(),
    stdholdtime(),
    stdtolrad(),
    stdvelo()
{
}

同様に、localframeveloのコンストラクターと他のmissionprofileコンストラクターについても同様です。

于 2012-08-07T18:51:32.250 に答える
1

を書くstdvelo()と、コンパイラはstdvelo.operator()()そのような関数が存在しないことを確認して文句を言います。

データメンバーはとにかく構築されます。線はまったく必要ありません。

また、開始値の割り当てよりも初期化を使用する方がわずかに高速です(ただし、コンパイラーが違いを最適化する可能性は高いですが)。

したがって、たとえば、2番目のコンストラクターにこれを使用します。

localframevelo(double init_ivelo, double init_cvelo, double init_rvelo)
    : ivelo(init_velo)
    , cvelo(init_cvelo)
    , rvelo(init_rvelo)
    , speed(sqrt(pow(ivelo, 2.0) + pow(cvelo, 2.0) + pow(rvelo, 2.0)))
{}

まず、etal0の代わりに使用します。init_velo

于 2012-08-07T18:53:55.370 に答える