"Addition"两个类

"Addition" of two classes

本文关键字:两个 Addition      更新时间:2023-10-16

我一直在以一种相当粗糙的功能方式进行一些动态系统模拟,目前正在尝试弄清楚 cpp 对象可以为我的代码带来什么。更具体地说,我正在考虑以下结构:

我想通过一个抽象类来指定动态系统,比如"DynSys",用一个纯粹的虚拟方法指定动力学(比如"能量"等)。一旦我从 DynSys 派生了两个具体类,我想对它们的实例进行"叠加",以创建一个新的 DynSys 对象,该对象返回两个相应动态成员函数的相加。这可能吗?例如:

DynamicHole Blackhole;     // DynSys derived
DynamicDisc Disc;          // DynSys as well
vector state;              // eg a dynamical array of numbers
Blackhole.energy(state);   // returns A(state)
Disc.energy(state);        // returns B(state)
??class?? HoleDisc = DynamicAddition(&Blackhole,&Disc); // is a DynSys
HoleDisc.energy(state);    // returns A(state)+B(state)

指向 DynSys 对象的指针将传递到模拟本身,因此结果必须是 DynSys 对象非常重要。

我看到一些使用"+"运算符或交朋友来添加类参数的结构。然而,这里的问题似乎是涉及方法加法的加法过程需要定义一个全新的具体类。

我看到了一个相当不优雅的解决方法,分别定义"核心"函数 A(状态,参数)、B(状态,参数),然后手动定义叠加类。我有很多叠加要做,所以我想知道是否有更好的方法来做到这一点。

如果我

理解正确,当您一起"添加"到 DynSys 时,您希望创建一些聚合。这是一个伪代码,可以适应您的需求:

class DynSysGroup : public DynSys
{
    DynSys& m_a;
    DynSys& m_b;
public:
    DynSysGroup(DynSys& a, DynSys& b) : m_a(a), m_b(b) { }

    // I'm guessing the signature of energy()...
    void energy(vector& v)
    {
        // Get A(state) with m_a
        // Get B(state) with m_b
        // Do A(state) + B(state)
    }
}

还有你上面的台词

??class?? HoleDisc = DynamicAddition(&Blackhole,&Disc); // is a DynSys

会成为

DynSysGroup HoleDisc(Blackhole, Disc);

当然,对于像m_am_b这样的参考,你需要确保你不会得到悬而未决的参考。也许您需要使用像 std::shared_ptr 这样的智能指针。


旁注:您可能想研究std::valarray并更改energy()的工作方式:与其将向量作为参数,不如简单地返回它(当然,如果适合您的设计)。

std::valarray DynSys::energy() const { return ...; }