我有一个静态函数,它需要访问类的数据成员。该函数可以是类的成员、非成员或友元函数,但它必须是静态的,并且不能接受任何参数。因此,我不能将数据成员作为参数传递给它,也不能将对象本身传递给它。
#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求解器,该求解器要求accelerator为static int类型并接受指定的参数,因此我不能将质量传递给accelerator,因为它将由ODE而不是main调用
有没有办法让加速器函数知道质量值?我不管它有多间接。
发布于 2012-07-04 05:35:24
如果这是在快速网络搜索中显示的"sundials“和"CVode”:
使用相关的nBody*作为user_data参数。
在用户功能文档(第55页)中对其进行了描述。
如果没有,请忽略此答案。
发布于 2012-07-04 03:10:06
让我开始说,,你的设计坏了,。需要访问类的非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-04 03:09:55
考虑到您的限制,一个可怕的解决方案是在类中有一个名为nBody *类型的类似currentNBody的静态变量,并在运行ODE求解器之前将其设置为适当的实例。
您正确地将其标识为全局变量。当然,如果你在做任何多线程的事情,这将会彻底失败。
https://stackoverflow.com/questions/11317501
复制相似问题