Несколько имен классов внутри одного файла .hpp - PullRequest
1 голос
/ 28 февраля 2011

Я только начинаю с 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;

Что означают два "class [name];"?В исходном коде есть разные Painter.cpp, Painter.hpp, Ball, hpp, Ball.cpp.

Это что-то вроде включения?

Ответы [ 4 ]

9 голосов
/ 28 февраля 2011

Это предварительные декларации , которые можно использовать, чтобы сказать, что имя существует, но его определения пока нет, но я хочу использовать имя.

Обратите внимание, что в классе используются только указатели и ссылки на Painter и Ball. При использовании предварительных объявлений это вполне нормально, но если вы вставите код, который зависит от знаний о внутренностях классов Painter или Ball (таких как вызов функции или использование переменной-члена класса), то вы пришлось бы включать фактические объявления класса.

Например, обратите внимание, как заголовок #include содержит заголовок brick.hpp, поскольку у класса есть контейнер std::vector<Brick>, в котором хранятся копии объектов Brick, и ему необходимо знать sizeof(Brick). В заголовке также используются Brick::WIDTH и Brick::HEIGHT.

Другим распространенным вариантом использования для предварительных объявлений является исправление проблемы циклической зависимости .

1 голос
/ 28 февраля 2011

На что вы обращаете внимание, это так называемое предварительное объявление типов.

Краткое объяснение состоит в том, что подобные вещи ускоряют компиляцию, поскольку компилятору не нужно просматривать заголовочные файлы, в которых объявлены эти типы, вы просто сообщаете ему, что типы существуют. Это возможно до тех пор, пока вам не нужно точно знать тип или использовать какие-либо члены. Это хорошая практика в заголовочных файлах.

Это только то, что вы делаете в заголовочных файлах. В файлах .cpp необходимо включать заголовки, в которых объявлены типы, потому что здесь вы, скорее всего, будете использовать типы и, следовательно, должны знать реальный тип и как он выглядит.

1 голос
/ 28 февраля 2011

Это просто означает: «Ожидайте, что когда-нибудь в будущем появятся классы Ball и Painter».

1 голос
/ 28 февраля 2011
...