【问题标题】:Distinction between different "kinds" of member variables不同“种类”成员变量之间的区别
【发布时间】:2019-10-03 19:08:32
【问题描述】:

我正在解析大型 XML 定义文件。 为了实现这一点,我开始为您在 xml 文件中遇到的每种“类型”创建类。

<Element Factor="10">Whatever</Element>

目前我将 XML 文件中的每个 type 放在它自己的类中,并带有一些运算符和类型的成员。

但是,其中一些types 同时具有“子元素”和“属性”。

即:

<MySimpleType min="20" max="100">
    <name>MyName</name>
    <SomeOtherElement>xxxx</SomeOtherElement>
</Mysimpletype>

目前这个类应该是这样的:

class MySimpleType{
    std::string MyName;
    TSomeOtherElement SomeOtherElement;
    int min;
    int max;
}

我想知道是否有办法对类成员进行注释,以便清楚所讨论的成员是属性还是元素。

元素可以有不同的类型(可能是另一个自定义类),属性大多是内置的或 ADT 的。

有没有办法清楚地将成员标记为“元素”或“属性”?

(如果有关系,我使用的是带有内置编译器的 Visual Studio 2015,所以我使用的是 c++11)

【问题讨论】:

  • 子元素和属性的本质区别在于属性通常是非常原始的类型,即不能有子元素的类型。但我建议你不要这样做。生成代码的系统的问题在于它们会生成代码。除了 DOM 之外,你不需要任何东西来处理 XML,如果你需要,你可能一开始就不需要 XML。
  • @user207421 谢谢,你是对的。然而,这些 XML 定义是众多产品的制造商为使用所述产品而提供的(考虑通过不同的通信协议进行设置)。因此,虽然 XML 不是正确的工具,但它是我拥有的工具 :)
  • 有没有办法清楚地将成员标记为“元素”或“属性”?您甚至可以将原始类型包装在包装器中以重新标记属性。例如。 template &lt;typename T&gt; struct AttrT { T value; };。你可以简单地做文档。这在 cmets 中也是如此。我的问题是为什么你需要知道数据来自哪里?
  • 由于您可以完全控制设计这个类,是的,有一定的“注释类成员的方法,以便清楚所讨论的成员是属性还是元素”。您只需实现它,无论哪种方式适合您。您的具体 C++ 问题到底是什么?
  • @SamVarshavchik 我的问题特别是关于在 C++ 中实现它的好方法,如您所见,问题不在于“设计类”,而是在一个类中,成员有不同除了它们的类型或名称之外的含义。因此,问题是,在 c++ 中实现这种区别的最佳或好的方法是什么。

标签: c++ xml c++11 annotations


【解决方案1】:

您可能有一些包装器类型来帮助识别:

template <typename T>
struct attribute { T value; };

等等

struct MySimpleType
{
    std::string MyName;
    TSomeOtherElement SomeOtherElement;
    attribute<int> min;
    attribute<int> max;
};

您可以丰富包装类,使其表现得更像底层类型(operator T&amp;()operator = (const T&amp;)、...)

【讨论】:

  • 糟糕。在我完成评论后才看到你的答案。 ;-)
【解决方案2】:

您可以使用 c++11 属性来标记您的字段:

class MySimpleType {
    [[fmashiro::element]] std::string MyName;
    [[fmashiro::element]] TSomeOtherElement SomeOtherElement;
    [[fmashiro::attribute]] int min;
    [[fmashiro::attribute]] int max;
};

虽然这会生成关于未知属性的警告。

另一种常见的方法是使用空宏:

#define FM_ELEMENT
#define FM_ATTRIBUTE

class MySimpleType{
    FM_ELEMENT std::string MyName;
    FM_ELEMENT TSomeOtherElement SomeOtherElement;
    FM_ATTRIBUTE int min;
    FM_ATTRIBUTE int max;
};

作为最后的选择,只需在声明中添加 /* attribute */ 注释即可。

【讨论】:

    猜你喜欢
    • 2015-10-21
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多