具有set参数的静态成员函数需要访问非静态数据成员

时间:2012-07-03 19:06:16

标签: c++ class static-functions

我有一个需要访问类的数据成员的静态函数。该函数可以是类的成员,非成员或朋友函数,但它必须是静态的,并且不能接受任何参数。所以我不能将数据成员作为参数传递给它,也不能将对象本身传递给它。

#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 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

考虑到你的约束,一个可怕的解决方案是在类中使用类似currentNBody的{​​{1}}之类的静态变量,并在运行ODE求解器之前将其设置为适当的实例。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果这是出现在快速网络搜索中的“日”和“CVode”:

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

如果没有,请忽略这个答案。