C++ 编写自己的输入操纵器

标签 c++

我有一个包含这个的数据文本文件

Map2D, [3, 2]
Dot3D, [25, -69, -33], [-2, -41, 58]
Map3D, [6, 9, -50]
Map2D, [3, 2]
Dot3D, [7, -12, 3], [9, 13, 68]
Map3D, [6, 9, 5]
Map2D, [3, 2]
Dot3D, [70, -120, -3], [-29, 1, 268]
Dot3D, [7, 12, 3], [-9, 13, 68]
Map3D, [1, 3, 8]
Dot2D, [5, 7], [3, 8]

基本上文本文件的第一个数据是我得到的 4 个类的类名

Map2D
Map3D
Dot2D
Dot3D

我试图编写自己的文件操纵器,以便我的程序可以提取上面的数据并为 4 个类中的每一个重载提取运算符 >>,然后将其存储到相关对象中。

我在考虑使用 vector 、 map 、集合或列表来存储。但是为此我如何实现我想做的事情,例如存储到类的相关对象中。

我尝试在谷歌上搜索如何创建我自己的文件操纵器,但如果有人可以向我展示一些示例代码并且我可以在测试文件中编译和执行它,然后自己观察输出,那就更好了。我想使用 iomanip 对 >> 运算符进行重载

对于造成的所有麻烦,我深表歉意。也可以不用数组实现下面的数据存储吗

我必须使用操纵器,因为我需要创建类似的东西

我需要做类似的事情

cout << "Input File Name";
cin >> readFile;

并执行所有数据读取和对象创建

然后它会逐行读取记录,然后创建类和其中的数据。

感谢您的帮助!

最佳答案

这是一个非常典型的抽象工厂模式的例子。

您不会使用 iomanip 来执行此操作。读取第一个单词,然后找到合适的处理程序并调用它来读取(解析)该行的其余部分并创建合适的对象。

对象本身不需要是协变的,用于创建它们的工厂应该是协变的。

当然,如果您想将它们全部存储在一个集合中,您将必须弄清楚您希望如何管理它。

如果您阅读了一个您不知道的“标题”,您当然会失败。

关于C++ 编写自己的输入操纵器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13347286/

相关文章:

c++ - 如何确定点是否在形状上和在形状上?

c++ - 为什么将好奇模板模式的基类直接转换为另一个基类会出错?

c++ 将 cin 和 cout 与 iostream 同步

c++ - 如何在 C++ 中获取当前运行的可执行文件的文件名

c++ - 为什么这是部分特化? (我能做什么?)

C++静态变量

c++ - 将标准输出转发到 Qt 应用程序中的文件

c++ - 嵌套命名空间中使用的不完整类型

c++ - QDomNode类在qt中读取child的值

c++ - QWT 安装错误