0

クラスのデータ メンバーにアクセスする必要がある静的関数があります。関数は、クラスのメンバー、非メンバー、またはフレンド関数にすることができますが、静的でなければならず、引数を取ることはできません。そのため、データ メンバーをパラメーターとして渡すことも、オブジェクト自体を渡すこともできません。

#include "sundials.h"
#include "CVode.h"

class nBody
{
private:
   double masses[];
   double** paths;
   static int accelerator();
   //...
public:
   //...
   void runODE();
};

int nBody::accelerator()
{
    // code that needs to know the values stored in masses[]
}
void nBody::runODE()
{
   //...
  ODEsetAccelerator(accelerator);  //require accelerator to be static int 
                                   //with specific parameters
   // run the ODE
   //record trajectories in paths[][]
}

acceleratorアクセラレータがタイプで指定された引数を取る必要がある別の ODE ソルバーに供給されるstatic intため、ODE によって呼び出され、そうではないため、質量をアクセラレータに渡すことはできません。main

アクセラレータ関数に質量の値を知らせる方法はありますか? それがどれほど間接的であるかは気にしません。

4

4 に答える 4

1

あなたのデザインは壊れていると言って始めましょう。クラスの非メンバーstaticにアクセスする必要があり、パラメーターを受け取ることができないメソッド?static

それはさておき、確かにできます。メソッド内からグローバルオブジェクトにアクセスできますstatic。これは、操作しようとしている現在のオブジェクトに設定されています。

extern nBody* currentBody;

//........
int nBody::accelerator()
{
    //access currentBody
    //since this is a member, you have access to other private members
}

//....
nBody someBody;
currentBody = &someBody;
nBody::accelerator();
于 2012-07-03T19:10:06.237 に答える
0

これは私があなたが話していると思うことです:いくつかの処理は質量を持つnBodyオブジェクトを作成しています。他のいくつかの処理では、それらを「加速」する必要があります。基本的に、nBodyオブジェクトを「加速プロセス」に「登録」する方法が必要です。これは、AccelerationProcessオブジェクトの静的メソッド、またはRMIなどを介したコールバックを介したものである可能性があります。nBodyオブジェクトが参照する状態を保持するのはアクセラレータプロセスであるため、nBodyに静的メソッドを設定する理由はありません。これは、オブジェクトがすべて同じメモリスペースにあると想定しています。そうでない場合、状況はさらに複雑になります。

于 2012-07-03T19:39:24.047 に答える
0

あなたの制約を考えると、ODEソルバーを実行する前に、currentNBodyタイプのようなものと呼ばれるクラスに静的変数を持ち、これを適切なインスタンスに設定するのが恐ろしい解決策です。nBody *

これをグローバル変数として正しく識別しています。もちろん、マルチスレッドで何かをしている場合、これは完全に失敗します。

于 2012-07-03T19:09:55.370 に答える
0

これが「日時計」と「CVode」で、クイック Web 検索で表示される場合:

関連するnBody*をパラメーターとして使用しuser_dataます。
これは、ユーザー関数のドキュメント (55 ページ) に記載されています。

そうでない場合は、この回答を無視してください。

于 2012-07-03T21:35:23.833 に答える