使用 Visual C++ 代码(类设计器)
类设计器将显示一个称作“类图”的可视设计图面,其中以可视形式提供了项目中的代码元素。 可以使用类图来设计和可视化项目中的类和其他类型。
类设计器支持以下 C++ 代码元素:
类(与托管类形状类似,只不过它可以具有多重继承关系)
匿名类(显示类视图为匿名类型生成的名称)
模板类
结构
Enum
宏(显示宏的处理后视图)
Typedef
备注
这与 UML 选件类关系图,您在建模项目中创建。有关更多信息,请参见UML 类图:参考。
类型解析和显示问题疑难解答
源文件的位置
类设计器不会跟踪源文件的位置。 因此,如果修改项目结构或移动项目中的源文件,则类设计器会失去对类型的跟踪(这一点对 typedef、基类或关联类型的源类型特别适用)。 您可能会收到错误消息,如Class Designer is unable to display this type。 如果出现这种情况,请将已修改或重新定位的源代码再次拖动到类图中以重新显示它。
更新和性能问题
对于 Visual C++ 项目,让源文件中所做的更改出现在类图中可能需要 30 到 60 秒的时间。 此延迟也可能导致类设计器引发错误No types were found in the selection。 如果收到此类错误,请在错误消息中单击**“取消”**,并等待代码元素出现在类视图中。 之后,类设计器应可以显示此类型。
如果类图未使用您在代码中所做的更改进行更新,则可能需要关闭关系图,并重新打开它。
类型解析问题
以下原因可能会导致类设计器无法解析类型:
该类型所在的项目或程序集未从包含类图的项目进行引用。 若要纠正此错误,请添加一个对包含该类型的项目或程序集的引用。 有关更多信息,请参见如何:使用“添加引用”对话框添加或移除引用。
由于该类型未处于正确的范围内,因此类设计器无法找到它。 确保代码未缺失 using、imports 或 #include 语句。 还请确保未将该类型(或相关类型)移出它原来所在的命名空间。
该类型不存在(或者已被注释掉)。 若要更正此错误,请确保未注释掉或删除该类型。
类型位于由 #import 指令引用的库中。 可行的解决方法是:手动将生成的代码(.tlh 文件)添加到头文件的 #include 指令中。
最有可能看到的有关类型解析问题的错误是Code could not be found for one or more shapes in class diagram '<element>'。 此错误消息不一定表示您的代码错误。 它仅指示选件类设计器无法显示您的代码。 尝试以下度量。
确保该类型存在。 确保您没有无意中注释掉或删除源代码。
确保选件类设计器支持您输入的类型。 C++ 代码元素的限制参见。
尝试解决该类型。 该类型可能在不会从项目引用包含选件类图的项目或程序集。 若要纠正此错误,请添加一个对包含该类型的项目或程序集的引用。 有关更多信息,请参见如何:使用“添加引用”对话框添加或移除引用。
确保该类型位于正确的大小,使选件类设计器可以找到它。 确保代码不缺少 using、imports或 #include 语句。 还请确保未将该类型(或相关类型)移出它原来所在的命名空间。
排除其他错误信息
在 Microsoft Developer Network (MSDN) 公共论坛中,可以找到有关对错误和警告进行疑难解答的帮助。 Visual Studio 选件类设计器论坛参见。
C++ 代码元素的限制
当加载 Visual C++ 项目时,类设计器将以只读方式运行。 可以更改类图,但无法将类图的更改保存回源代码。
类设计器仅支持本机 C++ 语义。 对于编译为托管代码的 Visual C++ 项目,类设计器将仅可视化本机类型的代码元素。 因此,可以向项目添加类图,但类设计器将不允许您可视化其 IsManaged 属性设置为 true 的元素(即值类型和引用类型)。
对于 Visual C++ 项目,类设计器只能读取类型的定义。 例如,假定您在头 (.h) 文件中定义了一个类型并在实现 (.cpp) 文件中定义了其成员。 如果对实现 (.cpp) 文件调用“查看类图”,则类设计器不会显示任何内容。 又比如,如果对使用 #include 语句以包含其他文件但不包含任何实际类定义的 .cpp 文件调用“查看类图”,则类设计器也不会显示任何内容。
定义 COM 接口和类型库的 IDL (.idl) 文件不会在关系图中显示,除非将其编译成本机 C++ 代码。
类设计器不支持全局函数和变量。
类设计器不支持联合。 这是一种特殊类型的类,在其中仅分配联合的最大数据成员所需的内存量。
类设计器不显示基本数据类型,如 int 和 char。
类设计器不显示在当前项目外部定义的类型(如果此项目不具有对这些类型的正确引用)。
类设计器可以显示嵌套类型,但不能显示嵌套类型与其他类型之间的关系。
类设计器无法显示 void 类型或从 void 类型派生的类型。