类可以包含可以通过方法加载的空白函数吗?

问题描述 投票:0回答:1

目前,我正在编写科学计算的代码。我想创建一个 MHD_Model 类,如下所示:

class MHD_Model{
    private:
    double position;
    double boundary_condidtion;
    double magnetic_field;
    public:
    // constructor, methods for setting the boundary condititon etc.
}

目前,

double magnetic_field;
是一个数字,但我需要将其设为位置的函数。我是这样想象的,首先我定义磁场,例如:

double Bfield(double x){
    return x*x;
}

然后编写一个名为

double MHD_Model::load_magnetic_field()
的方法,它将接受函数
Bfield
作为输入。但是,我无法让它发挥作用,并且我开始怀疑这不是正确的方法。

我不是受过训练的程序员,而是物理学家。我需要学习 C++/其他快速编程语言,因为我现在开始攻读博士学位,并将处理计算量大的东西。

我尝试将函数

Bfield
编写为按引用传递、按值传递,在类中使用
const double position
,但没有编译。我理解这些错误(大多数错误类似于:二元运算符 / 不能用于类型 double 和 (double *) double)。主要问题是我不知道编写此类行为的“正确”方式,并且我不确定这是否允许我想象的程序的结构方式。

有人可以提出任何建议,或者向我指出这方面的资源吗?我知道最好的方法是学习 C++,但我时间不够。

顺便说一句,我的主管也不会编程,所以我无法向他推荐,他只使用 Wolfram Mathematica。


编辑:

我将到目前为止我所编写的程序包含在我想象中的工作方式中:

主.cpp

#include <bits/stdc++.h>
#include <cmath>
#include <vector>
#include <print>

#include "mhd.hpp"

using namespace std;

double b(double *x){
  return 1./ &x;
}


int main(){

  double q = 10.;
  double x = .3;
  MHDModel model;
  model.set_equipartition(q);
  model.set_position(x);
  model.load_magnetic_field(&b);

  return 0;

}

mhd.cpp

#include "mhd.hpp"

#include <iostream>



void MHDModel::set_equipartition(double q) {
  equipartition = q;
  std::cout << "Setting equipartition parameter to " << q << "...\n";
};

void MHDModel::set_position(double x){
  jet_position=x;
};

void MHDModel::load_magnetic_field(double b){
  jet_mag_field = b;
};

mhd.hpp

#ifndef MHD_HPP
#define MHD_HPP

#include <iostream>

class MHDModel{
  private:
    double jet_position;
    double jet_mag_field;
    double equipartition;
  public:
    MHDModel(double x = 0., double q = 1.){
      jet_position = x;
      equipartition = q;
      std::cout << "Creating magnetohydrodynamic model..." << "\n";
    };
  void set_equipartition(double q);
  void set_position(double x);
  void load_magnetic_field(double b);
};

#endif // !MHD_HPP

虽然我知道它不应该起作用,但我不知道它会如何完成。研究起来有点困难,因为有关“将函数加载到类中”等的所有内容都与方法有关,但这里的情况并非如此(我认为?)。

c++
1个回答
0
投票

是的,您可以使用 std::function 将函数注入到您的模型中,如下所示:

// #include <bits/stdc++.h> <== NEVER include this... it is not standard C++
#include <functional>
#include <iostream>

// do NOT use `using namespace std;`

double b(double x) // No need to pass double as a pointer
{
    std::cout << "b called\n";
    return 1.0 / x;
}


class Model
{
public:
    Model(std::function<double(double)> fn) :
        m_fn{ fn }
    {

    }

    double calculate(double v)
    {
        return m_fn(v);
    }

private:
    std::function<double(double)> m_fn;
};

int main()
{
    Model model{ b };
    model.calculate(1.0);
}
© www.soinside.com 2019 - 2024. All rights reserved.