我一直在以相当粗糙的功能方式进行一些动态系统仿真,并且目前正在尝试弄清楚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_a
和m_b
这样的引用,您需要确保您没有悬挂的引用。也许您需要使用std::shared_ptr
之类的智能指针。旁注:您可能想研究
std::valarray
并更改energy()
的工作方式:您可以简单地将其返回(当然,如果它适合您的设计),而不是将向量作为参数。std::valarray DynSys::energy() const { return ...; }
关于c++ - 两课的“加法”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20032069/