c++ - 如何将A类型的数据写入B类型的格式

标签 c++ oop ooad

我正在实现一个生成结果并将其写入特定格式的文件的东西。

相当简单,但我希望它是动态的。

我会放弃一些类(class)。

数据 - 所有结果的基类
DataFile - 所有文件格式类型的基类,具有方法 addData(Data * data)

ErrorData - 从数据派生,包含有关错误的数据。
InfoData - 源自数据,包含通用信息。

XmlFile - 派生自 DataFile,包含 XML 格式的数据。
BinaryFile - 派生自 DataFile,包含二进制格式的数据。

我的问题是这样的:

如何将 ErrorData 写入 XmlFile 的实现放在哪里?

我不喜欢在答案中看到的内容:

  1. DataDataFileErrorData 的新成员函数>XmlFile (因为这意味着我每次添加新数据时都需要添加这些文件DataFile 派生类)
  2. 类型转换为派生类型。
  3. 总体丑陋:)

我了解基本的 C++ 虚拟化等知识,无需太具体。

不过,我确实很欣赏一些代码片段,它们减少了歧义。

我有一些关于创建一个 DataWriter 基类并从中派生类的想法,这些类知道如何编写数据 某种类型的 DataFile 某种类型,但我有点不确定它的具体细节。

编辑:

我将以示例的形式进行更多说明。

我们有 2 种新的文件格式:FormatATxtFileFormatBTxtFile

假设我们有一个 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/

相关文章:

c++ - 包含类如何调用包含类的成员函数 - C++中的组合

java - 仅在 oop 中将方法的范围限制到另一个类

c++ - C wINnet 互联网连接()

ruby - 常量与按需实例化的对象——哪个最优?

oop - 允许值空间中存在多个 "no-value"值

c++ - 从多个类中检索集合的值,正确的方法是什么?

java - 关于封装的问题(Book : HF OOA&D )

c++ - 如何在qt,opencv中依次显示目录中的所有图像

C++ 无效比较器

c++ - 从父类调用纯虚函数