我一直在以相当粗略的功能方式进行一些动态系统模拟,目前我正在试图找出cpp对象可以为我的代码带来什么。更具体地说,我正在考虑以下结构:
我想通过抽象类来指定动态系统,比如说“DynSys”,用纯虚方法指定动态(比如说“能量”等)。一旦我从DynSys派生出两个具体的类,我想在创建一个新的DynSys对象的意义上对它们的实例进行“叠加”,这个对象返回两个相应的动态成员函数的相加。这可能吗? E.G:
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(状态,参数),然后手动定义叠加类,我看到了一种相当不优雅的解决方法。我有很多叠加,所以我想知道是否有更好的方法来做到这一点。
答案 0 :(得分:1)
如果我理解正确,当您一起“添加”到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 ...; }