我正在实现一个生成结果并将其写入特定格式的文件的东西。
相当简单,但我希望它是动态的。
我会放弃一些类(class)。
数据 - 所有结果的基类
DataFile - 所有文件格式类型的基类,具有方法 addData(Data * data)
ErrorData - 从数据派生,包含有关错误的数据。
InfoData - 源自数据,包含通用信息。
XmlFile - 派生自 DataFile,包含 XML 格式的数据。
BinaryFile - 派生自 DataFile,包含二进制格式的数据。
我的问题是这样的:
如何将 ErrorData 写入 XmlFile 的实现放在哪里?
我不喜欢在答案中看到的内容:
- Data、DataFile、ErrorData 的新成员函数> 或 XmlFile (因为这意味着我每次添加新数据时都需要添加这些文件 或 DataFile 派生类)
- 类型转换为派生类型。
- 总体丑陋:)
我了解基本的 C++ 虚拟化等知识,无需太具体。
不过,我确实很欣赏一些代码片段,它们减少了歧义。
我有一些关于创建一个 DataWriter 基类并从中派生类的想法,这些类知道如何编写数据 某种类型的 DataFile 某种类型,但我有点不确定它的具体细节。
编辑:
我将以示例的形式进行更多说明。
我们有 2 种新的文件格式:FormatATxtFile 和 FormatBTxtFile。
假设我们有一个 InfoData 对象,它具有以下参数:
Line number of the message : 34
Message content : Hello World
写入 FormatATxtFile 的对象在文件中如下所示:
Line:34;Txt:Hello World;Type:Info
在 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 类具有以下参数:
Line number of the error : 56
Error text : LINK : fatal error LNK1168
10 Lines prior to error message: text1...
10 Lines after error message: text2...
Entire log af what happened: 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>
最佳答案
与其试图找到一个地方将其放入类中,不如创建一个新函数呢?
void copyData(const ErrorData *data, DataFile *output)
{
// ...
}
然后,您可以针对要转换的任何数据类型重载此函数。
或者,您也许可以使用模板:
template<typename A, typename B> copyData(const A *data, const B *output);
然后您可以将模板专门化为您需要支持的特定类型。
关于c++ - 如何将A类型的数据写入B类型的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5907714/