我正在实现一个生成结果并将它们写入某种格式的文件的东西。
相当简单,但我希望这是动态的。
我会放弃几节课。
Data - 所有结果
的基类DataFile - 所有文件格式类型的基类,有方法addData(Data * data)
ErrorData - 派生自 Data,包含有关错误的数据。
InfoData - 派生自 Data,包含通用信息。
XmlFile - 派生自 DataFile,包含 XML 格式的数据。
BinaryFile - 派生自 DataFile,包含二进制格式的数据。
我的问题是这样的:
我在哪里实现如何将ErrorData写入XmlFile?
我不喜欢在答案中看到:
- Data,DataFile,ErrorData或XmlFile的新成员函数(因为这意味着我每次添加新的Data或DataFile派生类时都需要添加它们)
- 类型转换为派生类型。
- 普遍的丑陋:)
我知道我的基本 C++ 虚拟化和东西,不需要特别具体。
不过,我确实很欣赏一些代码片段,它们会减少歧义。
我对制作DataWriter基类并从中派生类有一些想法,这些类将知道如何将特定类型的数据写入特定类型的DataFile,但我有点不确定具体的细节。
编辑:
我将以示例的形式进行更多说明。
让我们有 2 种新的文件格式,FormatATxtFile和FormatBTxtFile。
假设我们有一个InfoData对象并且它有参数:
消息行号:34
消息内容:Hello World
写入FormatATxtFile的对象在文件中如下所示:
行:34;文本:Hello World;类型:信息
在FormatBTxtFile中,它看起来像这样:
@Info,34,Hello World
一种将数据导出为不同格式的方法。我不需要导入,至少现在是这样。
使用它的代码会是什么样子:
DataFile * file = DataFileFactory::createFile(type);
std::vector<Data*> data = generateData();
file->setData(data);
file->writeTo("./FileName"); // correct end is added by DataFile type, ie .txt
编辑:
似乎我没有足够清楚地说明 Xml 和二进制文件格式会出现什么问题。对不起。
让我们使用与上面相同的InfoData对象并将其推送到 XmlFile 格式。在某个元素下,它可能会产生类似这样的东西:
<InfoLog>
<Info Line="34">Hello World</Info>
</InfoLog>
假设ErrorData类将具有以下参数:
错误的行号:56
错误文本:链接:致命错误 LNK1168
错误消息之前的 10 行:text1...
错误消息之后的 10 行:text2...
发生的整个日志:text3...
现在,当它被推入 XML 格式时,它需要完全不同。
<Problems>
<Error>
<TextBefore>text1...</TextBefore>
<Text line = 56>
LINK : fatal error LNK1168
</Text>
<TextAfter>text1...</TextAfter>
</Error>
...
</Problems>
整个文件可能看起来像这样:
<Operation>
<InfoLog>
<Info Line="34">Hello World</Info>
<Info Line="96">Goodbye cruel World</Info>
</InfoLog>
<Problems>
<Error>
<TextBefore>text1...</TextBefore>
<Text line = 56>
LINK : fatal error LNK1168
</Text>
<TextAfter>text1...</TextAfter>
</Error>
<Error>
<TextBefore>sometext</TextBefore>
<Text line = 59>
Out of cheese error
</Text>
<TextAfter>moretext</TextAfter>
</Error>
</Problems>
</Operation>