单个.hpp文件中的多个类名

时间:2011-02-28 18:59:41

标签: c++ forward-declaration

我刚开始使用C ++,所以我正在寻找一些代码来学习。我在Breakout游戏中找到了这段代码片段。

    #pragma once
    #include "force.hpp"
    #include "brick.hpp"
    #include <vector>

    class Painter;
    class Ball;

    class Wall
    {
    public:
      enum { ROWS_COUNT = 16,
         COLS_COUNT = 8 * 3 };
      enum { WIDTH = ROWS_COUNT * Brick::WIDTH,
         HEIGHT = COLS_COUNT * Brick::HEIGHT };
      Wall();
      void draw(Painter &) const;
      Force tick(const Ball &);
    public:
      typedef std::vector<Brick> Bricks;
      Bricks bricks_;
    };

我不理解的唯一部分如下:

    class Painter;
    class Ball;

两个“班级[名字];”是什么意思?在源代码中有不同的Painter.cpp,Painter.hpp,Ball,hpp,Ball.cpp。

这意味着某种包含?

4 个答案:

答案 0 :(得分:9)

那些是forward declarations,可以用来表示名称存在,但目前尚无定义,但我想使用该名称。

请注意,在类中,它仅使用指向PainterBall的引用。使用前向声明时,这是完全正常的,但如果你输入的代码依赖于PainterBall类的内部知识(比如调用函数或使用类的成员变量) ),那么你必须包括实际的类声明。

例如,请注意标头#includebrick.hpp标头的方式,因为该类有一个std::vector<Brick>容器,用于存储Brick个对象的副本,并且需要知道sizeof(Brick)。标头还使用Brick::WIDTHBrick::HEIGHT

前向声明的另一个常见用例是修复circular dependency problem

答案 1 :(得分:1)

这称为forward declaration

答案 2 :(得分:1)

这只是意味着“期待将来某个时候有一个Ball类和Painter课程。”

答案 3 :(得分:1)

您正在关注的是类型的前向声明。

简短的解释是,这种事情加速了编译,因为编译器不必查看声明这些类型的头文件,只需告诉它类型存在。只要您不需要确切地知道类型或使用任何成员,这是可能的。这是头文件中的一个很好的做法。

这只是你在头文件中做的事情。在.cpp文件中,您需要包含声明类型的标头,因为在这里您最有可能使用这些类型,因此必须知道真实类型及其外观。