重构我的代码。我的标题(标题保护问题)

Posted

技术标签:

【中文标题】重构我的代码。我的标题(标题保护问题)【英文标题】:refactoring my code. My headers (Header Guard Issues) 【发布时间】:2010-05-25 12:19:25 【问题描述】:

根据我遇到的一个错误,我不久前有一篇与此类似的帖子。我能够修复它,但从那以后我在做事时遇到了麻烦,因为标头一直阻止其他标头使用代码。老实说,这些标题让我感到困惑,如果有人有任何资源可以解决这些类型的问题,那将会很有帮助。

我真正想做的是能够将 rModel.h 包含在 RenderEngine.h 中。每次我将 rModel.h 添加到 RenderEngine.h 时,rModel.h 不再能够使用 RenderEngine.h。 (rModel.h 也有一个 RenderEngine.h 的#include)。

简而言之,RenderEngine 和 rModel 需要使用彼此的功能。除了所有这些混乱之外,Main.cpp 还需要使用 RenderEngine。

stdafx.h

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>

// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include "resource.h"

main.cpp

#include "stdafx.h"
#include "RenderEngine.h"
#include "rModel.h"

// Global Variables:

RenderEngine go;

rModel *g_pModel;

...code...........

rModel.h

#ifndef _MODEL_H
#define _MODEL_H
#include "stdafx.h"
#include <vector>
#include <string>
#include "rTri.h"
#include "RenderEngine.h"

........Code

渲染引擎.h

#pragma once
#include "stdafx.h"
#include "d3d10.h"
#include "d3dx10.h"
#include "dinput.h"
#include "rModel.h"

.......Code......

【问题讨论】:

rModel.h 是否缺少最终的#endif? 我认为这不是这里的主要问题) 【参考方案1】:

正如我在之前对这个问题的回答中所写,谷歌搜索了 C++ 中的 Forward declaration。 这可能会解决您的问题,但是,循环标头依赖性再次表明应用程序设计不佳。

【讨论】:

是的,我上次知道了。我试图对整个情况采取全新的方法并获得更准确的答案。如果第一个问题似乎是基于特定问题或错误,这是一种更广泛的方法来解决整个情况以及最佳实践是什么。但似乎这是一个常见的问题,前向声明是这些类型情况的明显答案。我想我会进一步研究。谢谢 好的,所以我明白前向声明就像函数原型一样。他们推迟到文档的其余部分完成。在这种情况下,我必须将两个类放在同一个文档中。但我记得你说过我可以将标题放在单独的文档中。我该怎么做呢?现在我在 RenderEngine 中得到了 rModel 的前向声明。我在 rModel.h 中包含了 RenderEngine.h。但是 main.cpp 已经声明了 RenderEngine.h,所以 rModel 中的 RenderEngine.h 被忽略了。 没关系,我现在采取了几种不同的方法。我从 main.cpp 中删除了 RenderEngine.h,只包含了 rModel.h,因为它有一个 RenderEngine.h 声明。那并没有解决问题。但我想我正在赶上。 请注意,此示例实际上是通过相互调用方法来实现无限循环。当然,你应该避免这种情况,但是,好吧,只是为了让你知道这是可能的。 我实际上是在尝试实现这个前向声明,但我认为我做得不对。没有把握。我确实读过它。当我用谷歌搜索时,很多关于函数前向声明和一些课堂上的内容。这是我现在得到的代码。我真的不想在这个pastie.org/976249 上继续创建新帖子【参考方案2】:

至少如果我正确理解你的问题,你就有一点问题。您基本上需要构建标题,以便包含形成有向无环图(强调无环)。

您可能需要做的是将您的“renderengine.h”分成两部分,其中一个仅包含前向声明,另一个包含您当前的其余内容。然后将“前向声明”标头包含到“rmodel.h”中,并将“rmodel.h”包含到“renderengine.h”中。

虽然有时这是不可避免的,但这种循环依赖通常表明您组织模块的方式存在问题。您目前拥有的 renderengine.h 和 rmodule.h 完全有可能是单个标头,或者可能是多个标头,但沿不同的行分开。

【讨论】:

以上是关于重构我的代码。我的标题(标题保护问题)的主要内容,如果未能解决你的问题,请参考以下文章

如何重构我的代码以避免从类外部引发事件?

PHP代码优化(重构)[关闭]

重构代码以不使用绝对路径或 URI [关闭]

将我的 DAL 代码重构为领域驱动设计或更现代的设计 (C# 3.5)?

我可以使用 RDS 格式来保护我的脚本代码吗

Qt Creator 代码文件重构