Doxygen 类图中星号作为可见性说明符的含义

汤姆·古德费罗

Doxygen 从 C++ 代码生成的一些 UML 风格的类图有一个“*”作为可见性限定符,另外一些这样的成员是重复的,例如在这个模拟示例中使用 foo() 和 fred() :

public:    virtual void foo() = 0;
protected: virtual void bar() = 0;
public:    virtual void fred() = 0;

输出可能是:

+ foo()
# bar()
* foo()
* fred()

因此 foo() 既显示为 public 又显示为 '*',而 fred() 显示为 '*'。这似乎与其他语言功能(例如虚拟、纯、模板化派生或重载、继承定义或返回类型)无关。

“*”可见性表示什么?

[使用 Doxygen 版本 1.8.13,撰写本文时的当前版本]

汤姆·古德费罗

TLDR:它是成员分组机制的产物,似乎不传达任何语言信息,即它不是 UML 的扩展。

详细信息:特别是“*”是从DotNode::writeBox()枚举成员组中生成的摘自此处

MemberGroupSDict::Iterator mgdi(*m_classDef->memberGroupSDict);
MemberGroup *mg;
for (mgdi.toFirst();(mg=mgdi.current());++mgdi)
{
  if (mg->members())
  {
    writeBoxMemberList(t,'*',*mg->members(),m_classDef);
  }
}

Doxygen 对成员组行为的手动描述记录了自动分组(“在类型和保护级别上将事物分组在一起”)和明确地通过外壳内///@{///@}分组注释。简短的实验表明,分组注释或通过显式命名自动组都会///@name导致成员被添加为一个组,因此以“*”可见性双重列出。例如这个类生成后续图表:

class base {
 public:
  ///@{
  void pubfoo();
  void pubbar();
  ///@}
  void pubfoo(char); // no '*' visibility
 protected:
  ///@name Group2
  void protfoo(); ///< Foolishly
  void protbar(); ///< Barely
};

为'base'生成的类图

这是一个古老的特性(从 2004 年开始),似乎是无条件的(至少对代码的简要检查没有显示超出“UML_LOOK=NO”大锤子的任何控制机制),并且可以安全地忽略。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章