如何包含两个不同的标题,其中包含两个具有相同名称的不同类?

Posted

技术标签:

【中文标题】如何包含两个不同的标题,其中包含两个具有相同名称的不同类?【英文标题】:How do I include two different headers that contain two different classes that have the same name? 【发布时间】:2011-04-20 07:07:45 【问题描述】:

我正在对旧的 MFC 应用程序进行一些更改。头文件“stdafx.h”包括另一个头文件“mfcextensions.h”,它定义了一个类“CMemDC”。在另一个标题中,我需要包含“afxtoolbar.h”,以便可以使用“CMFCToolBar”类。问题是,“afxtoolbar.h”最终将包含“memdc.h”,它定义了一个类“CmemDC”。结果是可以理解地得到 2011 的编译错误。

现在我确实可以控制我们现有的定义“CMemDC”的代码,但这在很多地方都有使用,所以我不想做太多改动。

克服这种情况的最佳策略是什么?我猜我可以以某种方式使用命名空间,或者另一种选择是重命名我们现有的类“CMemDC”,但这更多的是避免问题而不是解决问题。

干杯

【问题讨论】:

命名空间是名称冲突的解决方案(重命名除外)。 【参考方案1】:

使用命名空间是正确的途径,但您可能还想看看为什么在整个应用程序中声明 CMemDC。除非您真的需要在任何地方声明您的 CMemDC,否则您可能能够从 stdafx.h 中删除包含并仅包含在真正需要它的 cpp 文件中。

【讨论】:

我过度简化了问题,“mfcextensions.h”包括一大堆其他最终包括“memdc.h”的问题。我开始走这条路,因为它可能是最简单的解决方案,但有很多地方使用它。我想我会用 CMemDC 修改库并将其添加到命名空间【参考方案2】:

C++ 命名空间可能会对您有所帮助。将至少一个 CMemDC 类放在合适的命名空间中,并在您希望使用每个类的地方使用它们的完全限定名称。

您可以避免使用完全限定名称,并在当前范围内使用全局命名空间

using namespace yournamespacename;

但是,这不太明确(就无法直接查看您在代码中的某一点使用哪个 CMemDC 而言),如果您在同一范围内使用这两个类,这将不起作用。

【讨论】:

【参考方案3】:

如果您有 2 个具有相同名称的类,则最好的选择是使用命名空间。您也可以重命名您的课程。但是所有这些都已经在您的帖子中了。所以你自己回答了问题。没有什么魔法可以帮助您,因为您一直遇到名称冲突的常见问题,并且引入了命名空间来解决此类问题。

【讨论】:

以上是关于如何包含两个不同的标题,其中包含两个具有相同名称的不同类?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django 在 mysql 中的两个不同模式中使用两个具有相同名称的表

添加两个变量,其中包含来自同一数据库的两个不同表的值

如何在 Eclipse 中为交叉编译项目有条件地包含两个相同版本的不同名称库?

如何将 Git 补丁应用于具有不同名称和路径的文件?

使用具有相同字符串但顺序不同的列合并两个 data.frame

在不同“路径”上具有相同名称的firestore集合的索引