2014-11-07 1 views
-1

Я использую C++ и движок Irrlicht для создания игры для университетского проекта, и у меня возникла проблема.Создание объекта в функции, вызывающей цикл другого класса?

У меня есть класс под названием «Мир», который настраивает движок и загружает на карту, а основной класс создает объект этого класса, а конструктор называется созданием мира и настройкой механизма (все это работает отлично!).

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

Я не хочу придерживаться всей функции в классе World, так как расщепление было бы намного опрятным!

World.cpp & World.h = http://pastebin.com/qtTsGQAR

Player.cpp & World.h = http://pastebin.com/DR7aUiYf

+3

Пожалуйста, разместите здесь код, не все сети разрешают доступ к пастебину. – IllusiveBrian

+3

Вопросы должны быть самодостаточными. Это нормально, чтобы ссылаться на дополнительные данные, но это должно быть строго дополнительным, например, показывать код в реальном времени в онлайн-компиляторе. – Deduplicator

ответ

0

Если Player наследует от World, а затем создать Player, вы должны создать World, и что создает Player, который создает World и т. д. до бесконечности.

Решение не должно содержать Player inherit from World.
Что бы это было означает, что игрок был миром?
Это не имеет большого смысла.

+0

Причина, по которой я наследовал игрока от World, заключалась в том, чтобы использовать функции движка, установленные в World.h, чтобы создать камеру для игрока, мне нужно использовать указатели, созданные в World.h, есть ли способ сделать эти указатели глобальны по классам? – Sjk

+0

@Sjk Вы можете передать их в конструктор объекта игрока или в функции члена игрока. Вы * можете * сделать их глобальными, и испытывать беспорядок, который делает, это хороший способ научиться избегать этого, но глобальные данные обычно не являются правильным путем. Может быть, они даже не принадлежат к классу мира? (В общем, не наследуйте только для доступа к данным или коду - наследуйте, потому что одна вещь действительно * похожа на другую вещь.) – molbdnilo

+0

Удивительно, я буду играть и попробовать узнать еще кое-что! До сих пор было интересно учиться. Спасибо за помощь. – Sjk

0

Ваш класс Player подклассы мирового класса.

class Player: public World 
{ 
    public: 
    Player(); 
    ~Player(); 

    private: 
    void setup_player(); 
}; 

Создав класс Player, вызывается конструктор World. Тем не менее, ваш Всемирный конструктор создает экземпляр класса игрока:

World::World() 
{ 

    setup_engine(); 
    //open up the file path 
    //std::fstream fin(file_path); 
    //std::string command; 

    //open up the world 
    std::cout << "* Constructing World" << std::endl; 
    //loading the first level scene 
      smgr->loadScene("..\\Assets\\firstLevel.irr"); 
      std::cout << "** Constructing Complete" << std::endl; 

      Player playerone; 



} 

Затем конструктор класса World вызывается, и так далее.