星星在 Doxygen class 图中作为可见性说明符的含义

Meaning of a star as a visibility specifier in Doxygen class diagrams

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

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

输出可能是:

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

所以 foo() 显示为 public 和 '*',fred() 就像 '*'。这似乎与其他语言特性无关,例如虚拟的、纯的、模板化的派生或重载,或继承的定义,或 return 类型。

“*”可见性表示什么?

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

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

详情:具体的'*'是从DotNode::writeBox()枚举成员组生成的,excerpted from here:

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 手册对 member groups 行为的描述记录了自动分组 ("groups things together on type and protection level") 和通过 ///@{///@} 分组注释中的附件明确说明。简短的实验表明,分组注释或通过 ///@name 明确命名自动组会导致成员被添加为一个组,因此会以“*”可见性双重列出。例如,此 class 生成后续图表:

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

这是一个令人尊敬的功能(自 2004 年起),看似无条件的(至少对代码的简要检查没有显示 "UML_LOOK=NO" 的大锤之外的任何控制机制),可以安全地忽略。