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

鉴于您的限制,一个可怕的解决方案是在类中拥有一个名为类似currentNBody类型的静态变量,nBody *并在运行 ODE 求解器之前将其设置为适当的实例。

您正确地将其标识为全局变量。当然,如果你正在做任何多线程的事情,这将完全失败。

于 2012-07-03T19:09:55.370 回答
0

这就是我认为您在谈论的内容:某些处理正在创建具有质量的 nBody 对象。其他一些处理需要“加速”它们。您需要一种方法来通过“加速过程”“注册”nBody 对象。这可能是 AccelerationProcess 对象上的静态方法或通过 RMI 等的一些回调。加速器进程将 nBody 对象引用保持在其状态,因此没有理由在 nBody 上拥有静态方法。这是假设所有对象都存在于同一个内存空间中——否则事情会变得更加复杂。

于 2012-07-03T19:39:24.047 回答
0

如果这是在快速网络搜索中显示的“日晷”和“CVode”:

使用相关nBody*作为user_data参数。
它在用户函数的文档中进行了描述(第 55 页)。

如果不是,请忽略这个答案。

于 2012-07-03T21:35:23.833 回答