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
};
这是一个古老的特性(从 2004 年开始),似乎是无条件的(至少对代码的简要检查没有显示超出“UML_LOOK=NO”大锤子的任何控制机制),并且可以安全地忽略。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句