我正在用C++写一个3D网格化模型,该模型具有不同的单元格类型,所有单元格类型都存储在Grid类的 vector 中。我定义了一个基本的GridCell类,并且还有两个派生类GridCell1和GridCell2。
现在,在建立模型时,我读取了一个文本文件,该文件告诉我如何在Grid类中填充gridCell vector (std::vector<gridCell*> gridCellVector)
;意思是它告诉我将哪种类型的派生单元推入我的gridCellVector中。
然后,我读入另一个输入文件,其中包含第一个输入文件列出的顺序的Grid中每个GridCell的初始状态变量信息。
每个派生类(GridCell1和GridCell2)都具有一些其他变量没有的状态变量(私有(private)数据成员)。当我在第二个输入文件中读取时,如何(或可能)访问和更新/初始化/设置派生类的数据成员?
我尝试了几种不同的方法,似乎只能返回在GridCell基类中定义的get / set函数。当我逐步处理 vector 时,我无法弄清楚在使用每个派生的GridCell时如何访问派生类中的函数。
编辑:我很惊讶人们没有提到向下转换,只是说不使用dynamic_cast。我总是知道我要更新的GridCell的类型,因为在读取第一个输入文件时,我会跟踪已加载到 vector 中的内容。由于我总是确定GridCell的类型,所以dynamic_cast不安全吗?
双重编辑:。因为我将GridCell对象传递给其他函数,这些函数需要引用特定于所传递对象的适当GridCell实例的数据成员和函数,所以我意识到我模型的设计(很多部分)当前未传递要求。因此,到目前为止,我完全放弃了必须使用GridCelltypes的想法,而只会创建一个可以满足我所有需求的巨大GridCell类。这样,我就可以填充然后访问以后需要的任何数据成员和函数。
最佳答案
如果确定要使用两步过程,建议您给GridCell
一个纯虚拟的init
方法:
virtual void init(istream &) = 0;
然后在每个派生类中实现它。其目的是从文件中读取数据并初始化初始状态变量。