星星在 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" 的大锤之外的任何控制机制),可以安全地忽略。
一些由 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" 的大锤之外的任何控制机制),可以安全地忽略。