【问题标题】:C++ include loopC++ 包含循环
【发布时间】:2013-09-19 12:42:36
【问题描述】:

我是游戏开发的菜鸟,我想用 C++ 制作一个简单的平台游戏。问题是当我创建两个类(游戏和图形)时,我不能在 Graphics.h 中包含 Game.h,因为我已经在 Game.h 中包含了 Graphics.h。有谁能够帮我? 代码: 游戏.h:

#pragma once

#include "Graphics.h"

struct Game {
    Game();

    void init();
    void handle();

    bool running;

    Graphics g;
};

图形.h:

#pragma once

#include <SDL.h>

struct Graphics {
    SDL_Surface* screen;

    void init();

    void rect(SDL_Rect rect, Uint32 color);
    void rect(SDL_Rect rect, int r, int g, int b);
    void rect(int x, int y, int w, int h, Uint32 color);
    void rect(int x, int y, int w, int h, int r, int g, int b);

    void render(Game* game);
};

【问题讨论】:

  • 尽可能避免在 .h 文件中添加#includes,将最常用的头文件包含在一个常见的 .h 文件中(我称之为 PCH.h)并将该头文件包含在启动每个 cpp 文件并从 IDE 或 make 脚本打开预编译头文件。可能看起来很复杂,但从长远来看会为您省去很多麻烦
  • 没有理由真的每个类都有一个标题
  • 小心这种常见的标题思想:根据我的经验,它会迅速失控,最终会导致大量不必要的依赖。一般来说,包括你需要的,并且只包括你需要的。

标签: c++


【解决方案1】:

您可以在此处使用前向声明:

#ifndef GRAPHICS_H_ // portable include guards
#define GRAPHICS_H_

#include <SDL.h>

class Game; // forward declaration. Exactly the same as struct Game.

struct Graphics 
{
  // as before
};

#endif

因为Graphics 不需要Game 的定义。您很可能需要在Graphics 的实现文件中包含Game.h

查看相关帖子:When to use forward declaration?

【讨论】:

  • 我认为最好是更加一致并使用struct Game;
  • @KennyTM 可能。这不是我担心的那种事情。我添加了一条评论。
  • Nitpick:在技术上是 UB 不是用下划线后缀全大写保护宏吗?那应该是 GRAPHICS_H 而不是 IIRC。
  • @H2CO3 我去看看。我认为后修复是可以的,双下划线不好,前导下划线后跟大写字母不好。但我可能会错过一个。
  • @juanchopanza 是的,双下划线绝对是一个大禁忌:)
【解决方案2】:

您可以有一个合并 Game.hGraphic.h 的标头;没有理由每个类有一个标题。

如果使用GCC(然后使用g++ -Wall -g 编译),整个项目只有一个标头的优点是可以precompile your header。另见this answer

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2011-03-23
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2013-12-27
    • 2016-03-19
    相关资源
    最近更新 更多