如何区分 MFC 类和用户定义的类
Posted
技术标签:
【中文标题】如何区分 MFC 类和用户定义的类【英文标题】:How to differentiate between MFC Classes and User-defined classes 【发布时间】:2020-03-18 15:19:36 【问题描述】:我正在学习 MFC。如果我没记错的话,所有 MFC 类的名称以大写字母“C”开头(例如CFrameWnd
、CFile
、CMenu
等.)
我发现 Visual Studio 向导为基于 MFC 的项目生成的代码与用户定义的类具有相似的名称。例如,如果我将我的项目命名为“Shapes”,则为该项目生成的类包含 CShapesApp
、CMainFrame
、CChildView
等类。
最后,您的项目中将有几个类,可能类似于CShapesApp
、CFrameWnd
、CMainFrame
、CWinApp
、CWnd
等。
问题: 对我来说,类(用户定义和 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”..好吧,这就是我想知道的,因为对我来说,CMainFrame
和 CFrameWnd
听起来或多或少相似,相似@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 类和用户定义的类的主要内容,如果未能解决你的问题,请参考以下文章