液压系统仿真

时间:2019-06-18 17:59:18

标签: c++ memory simulation abstract directed-acyclic-graphs

我解决了这个问题:我有一个液压系统,它的组成部分是水源,水槽,水龙头,简单的水管,T型管和X型管,它们对水通量产生某些作用(水源产生水流,T型管将水流分开)在HSystem的两个分支的一半中,X形管将1/3和2/3的两个分支产生的通量分开,下沉收集通量,依此类推。显然,我可以有多个来源和一个接收器。用户设置每个水源的输入通量(一个整数),我必须提供每个水槽中收集的水量。

因此,我创建了一个基类“ Component”,在其中存储了组件名称,传递给下一个组件的助焊剂,一些吸气剂和模拟其行为的虚拟方法。然后,我为实现虚拟方法的其他组件派生了其他类。最终,我创建了HydraulicSystem类,并将所有组件存储在Component的向量中,但是由于“ Component”是抽象类,因此我无法实例化对象,因此只能存储Component类型的指针。 我最终想到的是,每个组件都可以跟踪其他组件之前出现的情况(X射线管2个,否则1个),并模拟HSystem从像这样的接收器向后移动(我将在定义旁边编写一些实现以使更容易阅读)

class Component{
public:
//constructor and destructor
//...
//
vector<Component*> getConnected() const;
int simulate() = 0;
private:
string _name;
int flux;
vector<Component*> _connected;

}

class T_Tube : public Component{
public:
//...

 int simulate() { 
for(int i=0;i<_connected.size();i++){
flux = ...
private :
...
}
 return flux;
}

class Sink : public Component{
public :
...
int simulate(){
return getConnected()[0]->simulate();
}
private :
...
}

// other classes
}

然后在HSystem类中,从每个接收器开始,我调用其Simulation方法,该方法从与他连接的组件中调用Simulation,依此类推。这种方法似乎可行,但是由于我需要使用“ new”向HSystem中添加新组件,因此我还需要释放该内存,但是如果我尝试在HSystem析构函数中执行此操作,则会遇到麻烦,因为Component本身具有向量类型为Component。我也尝试过使用智能指针,但是它也不起作用。 我无法理解的是为什么我的程序可以正常运行,并且如果我不关心释放内存,也不会出现内存泄漏或分段错误的情况?

如果我放弃最初的想法,在每个组件中本地维护谁来的信息,然后像DAG一样组织整个HSystem,您认为这是一个更好的主意吗?在这种情况下,我虽然要对图进行拓扑排序,但是如何模拟它呢? 预先感谢

1 个答案:

答案 0 :(得分:0)

一般方法是持有std::vector<std::unique_ptr<Component>>std::vector<std::shared_ptr<Component>>。对其他Component的引用应该是原始指针(如果可以确定Component仍然存在),或者应该是std::weak_ptr(如果没有)。

但是,对于此应用程序,没有必要像这样管理内存。逻辑是:

  1. 阅读用户输入并创建所有组件
  2. 模拟系统
  3. 可用内存?
  4. 退出

第3步毫无意义,因为第4步无论如何都会这样做。因此,只需存储原始指针,而不必理会delete

请注意,如果您在同一程序运行中循环模拟多个系统(您可能会耗尽内存),则此方法不起作用,但是实际上运行新进程可能是处理该问题的正确方法。