2

したがって、次のヘッダーファイルを持つ基本クラスがあります。

#ifndef ODESolver_H
#define ODESolver_H
#endif
#include "DoublePendulum.h"

class ODESolver
{
public: 
    ODESolver(DoublePendulum &);
    virtual void Predict(const double &)=0;
    DoublePendulum DP;
};

実装:

#include "ODESolver.h"
#include <iomanip>

ODESolver::ODESolver(DoublePendulum &DPRef) :DP(DPRef)
{}

そしてそれを継承するクラス:

#ifndef ODEEuler_H
#define ODEEuler_H
#endif

#include "ODESolver.h"

class ODEEuler : public ODESolver
{
public:
    ODEEuler(DoublePendulum &);
    void Predict(const double &);
};

実装:

#include "ODEEuler.h"

ODEEuler::ODEEuler (DoublePendulum &DPRef) :ODESolver(DPRef)
{}

void ODEEuler::Predict(const double &dt=0.005)
{
    DP=DP+DP.Derivate()*dt;
    cout << DP.getUp().getTheta() << endl;
}

問題は、上記の実装でDP=DP+DP.Derivate()*dt;は何もしないということです。これがどのように可能であるか私にはわかりません。メンバー関数が機能するかどうかを確認.Derivate()しましたが、実際には正しい値/オブジェクトが返されます。その上、私がそこで何をするかは問題ではありません。たとえばDP=DoublePendulum RandomObject(1,2,3,4)、DPを同じに保つことができます。何か案は?私は十分な情報を提供したと思います...

また、DoublePendulumなどの実装と宣言:

http://pastebin.com/ny3pU8aR

4

1 に答える 1

3

この代入演算子

DoublePendulum DoublePendulum::operator= (DoublePendulum &DoublePendulumA)
{
        return DoublePendulum (DoublePendulumA);
}

新しい値を作成しますが、実際には割り当ての左側に何も割り当てません。だから変わらない!

割り当ての標準形式は次のようになります

DoublePendulum& DoublePendulum::operator= (const DoublePendulum& DoublePendulumA)
{
    // assign to members of this object

    return *this;
}
于 2012-05-07T21:36:11.953 に答える