gpt4 book ai didi

c++ - 在 C++ 中的对象之间共享数据的模式

转载 作者:可可西里 更新时间:2023-11-01 16:05:56 25 4
gpt4 key购买 nike

我已经开始将用 FORTRAN 编写的高能物理算法迁移到用 C++ 编写的面向对象的方法。 FORTRAN 代码在很多函数中使用了很多全局变量。

我已将全局变量简化为一组输入变量和一组不变量(变量在算法开始时计算一次,然后由所有函数使用)。

此外,我将整个算法分为三个逻辑步骤,由三个不同的类表示。所以,以一种非常简单的方式,我有这样的东西:

double calculateFactor(double x, double y, double z)
{
InvariantsTypeA invA();
InvariantsTypeB invB();

// they need x, y and z
invA.CalculateValues();
invB.CalculateValues();

Step1 s1();
Step2 s2();
Step3 s3();

// they need x, y, z, invA and invB
return s1.Eval() + s2.Eval() + s3.Eval();
}

我的问题是:

  • 为了进行计算,所有 InvariantsTypeXStepX 对象都需要输入参数(而且不仅仅是三个)。
  • s1s2s3三个对象需要invAinvB的数据 对象。
  • 所有类都通过组合使用其他几个类来完成它们的工作,并且所有这些类还需要输入和不变量(例如,s1 有一个成员ThetaMatrix 类的对象 theta 需要 xzinvB 来构建).
  • 我无法重写算法来减少全局值,因为它遵循几个高能物理公式,而这些公式就是这样。

是否有一种好的模式可以将输入参数和不变量共享给用于计算结果的所有对象?

我应该使用单例吗? (但是 calculateFactor 函数被计算了大约一百万次)

或者我应该在创建对象时将所有必需的数据作为参数传递给对象吗?(但如果我这样做,那么数据将在每个类的每个成员对象中到处传递,造成困惑)

谢谢。

最佳答案

好吧,在 C++ 中,根据您的约束和条件,最合适的解决方案是由指针表示的。许多开发人员告诉您使用 boost::shared_ptr。好吧,这不是必需的,尽管它提供了更好的性能,尤其是在考虑系统故障的可移植性和鲁棒性时。

您无需绑定(bind)即可提升。的确,它们没有被编译,现在标准化过程将导致 c++ 和 boost 直接集成为标准库,但如果你不想使用外部库,你显然可以。

那么让我们尝试仅使用 C++ 及其实际提供的功能来解决您的问题。

你可能有一个 main 方法,你之前说过,初始化所有不变量元素...所以你基本上有常量,它们可以是任何可能的类型。如果需要,无需使它们保持不变,但是,主要是实例化不变元素并将它们指向所有需要使用它们的组件。首先在一个名为“common_components.hpp”的单独文件中考虑以下内容(我假设您需要一些类型作为不变变量):

typedef struct {
Type1 invariant_var1;
Type2 invariant_var2;
...
TypeN invariant_varN;
} InvariantType; // Contains the variables I need, it is a type, instantiating it will generate a set of global variables.
typedef InvariantType* InvariantPtr; // Will point to a set of invariants

在您的“main.cpp”文件中,您将拥有:

#include "common_components.hpp"
// Functions declaration
int main(int, char**);
MyType1 CalculateValues1(InvariantPtr); /* Your functions have as imput param the pointer to globals */
MyType2 CalculateValues2(InvariantPtr); /* Your functions have as imput param the pointer to globals */
...
MyType3 CalculateValuesN(InvariantPtr); /* Your functions have as imput param the pointer to globals */
// Main implementation
int main(int argc, char** argv) {
InvariantType invariants = {
value1,
value2,
...
valueN
}; // Instantiating all invariants I need.
InvariantPtr global = &invariants;
// Now I have my variable global being a pointer to global.
// Here I have to call the functions
CalculateValue1(global);
CalculateValue2(global);
...
CalculateValueN(global);
}

如果您有返回或使用全局变量的函数,请使用指向修改您方法接口(interface)的结构的指针。通过这样做,所有更改都将被淹没到所有使用 thoss 变量的人。

关于c++ - 在 C++ 中的对象之间共享数据的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4795775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com