我一直在以相当粗糙的功能方式进行一些动态系统仿真,并且目前正在尝试弄清楚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 ...; }

关于c++ - 两课的“加法”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20032069/

10-10 21:37