Как мне настроить макет включений для моей программы? - PullRequest
3 голосов
/ 29 января 2012

В настоящее время я пытаюсь сделать RPG-игру, и у меня возникли некоторые проблемы. Это макет у меня до сих пор.

Классы:

  • Актер - базовый класс для всего, что «существует», например, отрядов, снарядов и т. Д.
  • Юнит - Наследует Актер, основа для всех юнитов.
  • Игра - в ней будет только один экземпляр, и он будет содержать указатели на все объекты в игре. Я планирую заставить его вызывать виртуальную функцию gameTick для всех актеров каждые 0,1 секунды.

Проблема, с которой я столкнулся, заключается в том, что я хотел бы, чтобы у всех актеров был указатель на экземпляр Game. Если бы я хотел иметь заклинание, которое наносит 500 единиц урона по радиусу, я бы хотел, чтобы игра обнаружила и вернула все указатели юнитов в этом диапазоне.

Моя проблема в том, что если я включу Game в заголовочный файл Actor, моя программа не будет компилироваться. Как я могу получить доступ к игре у моих актеров? Или я поступаю неправильно?

Заранее спасибо.

// START main.cpp

#include <iostream>
#include "game.h"

int main()
{
    std::cout << "All done\n";

    return 0;
}

// END main.cpp



// START actor.h

#ifndef __ACTOR_H_
#define __ACTOR_H_

#include <iostream>

//#include "game.h" Causes many errors if uncommented

class Actor
{
public:
    Actor();

    std::string name_;
};

#endif

// END    actor.h



// START actor.cpp

#include "actor.h"

Actor::Actor()
{
    name_ = "Actor class";
}
// END actor.cpp



// START unit.h

#ifndef __UNIT_H_
#define __UNIT_H_

#include "actor.h"

class Unit : public Actor
{
public:
    Unit();
};

#endif

// END unit.h



// START unit.cpp

#include "unit.h"

Unit::Unit()
{
    name_ = "Unit class";
}

// END unit.cpp



// START game.h

#ifndef __GAME_H_
#define __GAME_H_

#include <vector>

#include "unit.h"

class Game
{
public:
    std::vector< Actor * > actors_;
    std::vector< Unit * > units_;
};

#endif

// END game.h

Ответы [ 2 ]

2 голосов
/ 29 января 2012

Вместо того, чтобы делать:

#include "actor.h"
#include "unit.h"

Вы можете просто объявить два класса вперед:

class Actor;
class Unit;

Поскольку вы используете только указатели, компилятору просто нужно знать, что тип является классом, ему не нужно знать ничего другого. Теперь в файле cpp вам нужно сделать #include s

1 голос
/ 29 января 2012

Предварительной декларации может быть достаточно для ваших целей.Единственные ситуации, когда объявления fwd недостаточно, это

  • , если вам нужно создать экземпляр объекта класса: компилятор должен знать, как этот объект должен быть построен
  • , есливам нужно получить доступ к открытым методам / атрибутам этого класса: компилятор должен знать, как работают эти методы или к какому типу атрибутов вы пытаетесь получить доступ.

Если вы не выполняете ни одно из указанных выше действий, чем достаточно предварительного заявления.

...