c++ - 更新 vector 内同一基类的不同派生类的数据成员

标签 c++ inheritance vector

我正在用 C++ 编写一个 3D 网格模型,它具有不同的单元类型,所有单元类型都存储在 Grid 类中的 vector 中。我定义了一个基GridCell类,并且还有两个派生类GridCell1GridCell2

现在在设置模型时,我读了一个文本文件,它告诉我如何填充我的gridCell vector (std::vector<gridCell*> gridCellVector)Grid类中;这意味着它告诉我将哪些类型的派生单元推回到我的gridCellVector中。

然后,我读入另一个输入文件,其中包含 Grid 中每个 GridCell 的初始状态变量信息,按照第一个输入文件列出的顺序。

每个派生类(GridCell1GridCell2)都有一些其他类没有的状态变量(私有(private)数据成员)。当我在第二个输入文件中读取时,如何(或者是否可以)访问和更新/初始化/设置派生类的数据成员?

我尝试了几种不同的方法,但似乎只能返回 GridCell 基类中定义的 get/set 函数。当我单步执行 vector 时,我无法弄清楚如何在处理每个派生 GridCell 时访问派生类中的函数。

编辑:我很惊讶人们除了说不使用dynamic_cast之外没有提到向下转型。我总是知道我正在更新的 GridCell 的类型,因为我在读取第一个输入文件时跟踪已加载到 vector 中的内容。由于我始终确定 GridCell 的类型,所以dynamic_cast 不安全吗?

双重编辑:。因为我将 GridCell 对象传递给需要引用特定于所传递对象的相应 GridCell 实例的数据成员和函数的其他函数,所以我正在实现设计(我的模型的许多部分目前未通过测试。因此,目前,我放弃了必须使用 GridCell 类型的想法,而只会创建一个满足我所有需求的巨大 GridCell 类。这样我就可以填充并访问以后需要的任何数据成员和函数。

最佳答案

如果您确定要使用两步过程,我建议您为 GridCell 提供纯虚拟 init 方法:

virtual void init(istream &) = 0;

然后在每个派生类中实现它。其目的是从文件中读取数据并初始化初始状态变量。

关于c++ - 更新 vector 内同一基类的不同派生类的数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31911663/

相关文章:

python - 将 PCL 链接到 Cython C++ 模块

c++ - 什么是 __declspec,我什么时候需要使用它?

c++ - 如何编写 C++ getter 和 setter

objective-c - swift 中的动态子类实例化

c++ - 调用 C++ 隐藏运算符函数

c++ - 在 C++ 中获取用户输入的第一个字母

c++ - 策略继承和不可访问的 protected 成员

c++ - 为 std::vector 分配几 GB 内存

c++ - 如何使用 Xcode 7.3 在 C++ 中使用 vector ?

c++ - 对多个字段的元素进行排序