gpt4 book ai didi

c++ - 两个类的 "Addition"

转载 作者:行者123 更新时间:2023-11-28 07:17:14 26 4
gpt4 key购买 nike

我一直在以一种相当粗糙的函数式方式进行一些动态系统模拟,目前正试图弄清楚 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(state,parameters)、B(state,parameters),然后手动定义叠加类,我看到了一个相当不优雅的解决方法。我有很多叠加要进行,所以我想知道是否有更好的方法来做到这一点。

最佳答案

如果我理解正确,当您一起“添加”到 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() 的工作方式:您可以简单地返回它(当然,如果它适合您的设计),而不是将 vector 作为参数。

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

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

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