2

シミュレーションプログラムをセットアップしようとしています。シミュレーションはいくつかのステップで実行され、シミュレーション クラスはさまざまなクラスの ::step() を呼び出す必要があります。そのうちの 1 つが _experiment クラスです。

実験クラスにはシミュレーションクラスが必要であり、シミュレーションクラスは実験クラスが何であるかを知る必要があるため、これを機能させることができません。したがって、それらは循環依存です。前方宣言を使用して解決しようとしましたが、前方宣言されたクラスのメソッドにアクセスできません。それでは、前方宣言のポイントは何ですか?誰でも私を助けることができますか?ありがとう!

main.cpp

int main()
{
    _experiment experiment;
}

実験.cpp:

#include "experiment.h"

_experiment::experiment()
{
    _simulation simulation;
    simulation.experiment = this;
    simulation.start();
}

void _experiment::step()
{
    //Apply forces to simulation
}

実験.h:

#include "simulation.h"

class _experiment {
public:
    void step()
};

シミュレーション.cpp:

#include "simulation.h"

void _simulation::run()
{
    //Run simulation for 1000 steps
    for(int i = 0; i < 1000; i++)
    {
        experiment->step() //Calculate forces. Doesnt work (cant use member functions of forward declared classes. How to work around this?

        //Calculate motion
    }
}

シミュレーション.h:

class _experiment; //Forward declaration

class _simulation {
public:
     _experiment* experiment
     void run();
};
4

2 に答える 2

0

Simulation.cpp に の定義がなく_experiment、experiment.h ファイルをソース ファイルに含めると、すべてが機能するはずです。

また、この_experimentクラスはあなたの例では使用されていないようです_simulation。そのため、experiment.h に Simulation.h を含める必要はありません。また、ヘッダー ファイルにインクルード ガードを追加します。

于 2011-12-13T15:24:36.733 に答える
0

experiment.hの定義はまったく依存しないため、 includesimulation.hや forward declareの必要はありません。_simulation_experiment_simulation

の定義には へのポインタが含まれている_experimentため、完全な定義は必要ありません。simulation.h_simulation_experiment

欠けているのは、ソース ファイル内の両方のクラスの定義です。クラス定義が必要なため、両方のソース ファイルから両方のヘッダーをインクルードします。すべて問題ないはずです。

一般に、ソース ファイルに必要なすべてのヘッダーを含め、前方宣言以上のものが必要な場合にのみ別のヘッダーからのヘッダーを含めると、循環依存の問題をほとんど回避できます。

また、ヘッダーにインクルード ガードを追加して、他のヘッダーからヘッダーをインクルードする必要がある場合に複数の定義を避ける必要があります。

それでは、前方宣言のポイントは何ですか?

クラスが依存する他のものを宣言する必要なく、クラスが存在することを宣言できます。クラスへのポインターまたは参照を定義したり、クラスを引数または戻り値の型として関数を宣言したり、前方宣言のみで関数を宣言したりするなど、いくつかの便利なことを行うことができます。クラスのサイズやメンバーの知識が必要なことは何もできません。

于 2011-12-13T15:25:29.420 に答える