如何区分 MFC 类和用户定义的类

Posted

技术标签:

【中文标题】如何区分 MFC 类和用户定义的类【英文标题】:How to differentiate between MFC Classes and User-defined classes 【发布时间】:2020-03-18 15:19:36 【问题描述】:

我正在学习 MFC。如果我没记错的话,所有 MFC 类的名称以大写字母“C”开头(例如CFrameWndCFileCMenu 等.)

我发现 Visual Studio 向导为基于 MFC 的项目生成的代码与用户定义的类具有相似的名称。例如,如果我将我的项目命名为“Shapes”,则为该项目生成的类包含 CShapesAppCMainFrameCChildView 等类。

最后,您的项目中将有几个类,可能类似于CShapesAppCFrameWndCMainFrameCWinAppCWnd 等。

问题: 对我来说,类(用户定义和 MFC 库)的名称看起来非常相似,很难区分它是用户定义类还是 MFC 库类。

为什么基于 MFC 的项目选择这样的命名约定(即为什么要在用户定义的类前面放“C”)?

如何轻松区分 MFC 库类和用户定义的类?

更新:我知道我可以更改名称并且我已经尝试过了。但一般约定是使用 "C" 开始类名,即使对于用户定义的类,我的问题是为什么?以及如何轻松区分?

【问题讨论】:

您可以随意重命名。如果您重新运行应用程序向导,您可以使用 Generated Classes 列表并在那里重命名它们。 docs.microsoft.com/en-us/cpp/mfc/reference/… 类名前面的C 纯粹是MFC 约定。您可以随意命名标识符。拥有C 的好处是您可以立即看到它是一个类名。这在 15 年前左右是一个相当大的优势,但与今天的智能编辑器不太相关。 通常,Microsoft 使用前缀来帮助您了解名称的用途——C 是类。这是为了帮助将名称与其他可能的名称区分开来(如全局变量、函数等)。见:en.wikipedia.org/wiki/Hungarian_notation 您可以使用自己的前缀轻松区分。如果您不想保留 C,则没有理由保留 C @LouFranco:谢谢,我知道我可以更改名称,但一般约定是将“C”放在前面。我必须处理使用这种约定编写的遗留代码,对我来说,区分 MFC 和用户定义的类是相当混乱的。 【参考方案1】:

为什么基于 MFC 的项目选择这样的命名约定(即为什么要在用户定义的类前面加上“C”)?

这是不可能回答的。猜测一下,这只是 90 年代初期的常见做法。命名空间于 1995 年被添加到 C++ 中,即 MFC 工作开始多年后,因此 MFC 在全局命名空间中结束。为类使用 C 前缀可减少符号与 Windows API 和 SDK 标头发生冲突的机会。

如何轻松区分 MFC 库类和用户定义的类?

MFC 类用户定义的类。目前尚不清楚为什么需要区分 MFC 提供的用户定义类和代码提供的用户定义类。如果你觉得这很有用,那就没有捷径可走。您只需要记住哪些属于 MFC。

但是,MFC 中有 2 组类,了解它们在哪组是有帮助的:“原始”类和 Visual Studio 2008 引入的类(我相信),它们提供更广泛的功能。您可以通过查看前缀来区分这些集合:“原始”类以C 开头(如CButton),更新后的类具有CMFC 前缀(如CMFCButton)。

【讨论】:

“你只需要记住哪些属于 MFC”..好吧,这就是我想知道的,因为对我来说,CMainFrameCFrameWnd 听起来或多或少相似,相似@987654330 @ 和 CMainApp 听起来很相似。 @use:你还没有解释,为什么你需要知道,任何给定的类型是用户创作的还是图书馆提供的。我觉得这种区别有些人为。 供您参考,这是来自visual studio 2019的MFC类列表docs.microsoft.com/en-us/cpp/mfc/reference/… 这已在this answer 中发布到同一作者最近提出的问题(包括指向层次结构图的链接)。 @IInspectable:我需要学习如何轻松区分,因为我经常发现创建 MFC 类和用户定义类的对象实例。而且,由于名称相似,我必须经常查找定义以确定它是用户定义的还是基于 MFC 的。如果它是用户定义的,那么我需要了解更多。【参考方案2】:

“C”前缀约定是您的喜好问题。但请注意,所有 MFC 派生类实际上“是”MFC 类——在继承意义上,派生类“也是”祖先。所以不要忘记你的 CWnd 派生的 CMyWnd 拥有 CWnd 也有的一切。 我个人的命名方法(我在几个开发团队中介绍过)是对所有 MFC 派生类使用“C”前缀,而对非 MFC 派生类使用另一个(甚至不使用)前缀。

【讨论】:

以上是关于如何区分 MFC 类和用户定义的类的主要内容,如果未能解决你的问题,请参考以下文章

MFC---典型类和函数

MFC---典型类和函数

MFC如何添加自定义控件

,如何判别,是java自带的类/方法还是用户自己编程得到的.在命名方法上是不是可以区分出来.

MFC怎么知道哪个窗口对应的哪个类

如何区分 MFC(VC++)中的文件夹类型(Windows/FTP)?