0

What am I trying to do?

I am trying to make game. Instead of having global "managers" , I decided that I could pass all managers down the hiearchy. My plan was to make "Application" class, that would hold all "manager" objects, like Window, Asset Manager, etc... Application would then pass it's reference to SceneManager, SceneManager would pass Application reference to Scene and Scene whould then pass it to GameObjects, so it would be possible to call any manager from any level of hiearchy.

The problem is, my Application holds SceneManager. And SceneManager needs to pass Application reference to Scene.

Diagram:

Diagram

Code: (Simplified)

Application:

Application relies on SceneManager, because it needs to hold it and update it.

#include "SceneManager"
class Application {
  public:
    SceneManager& getSceneManager();
    void update();
    void quit();
enter code here
  private:
    SceneManager sceneManager;
    // Input, Window, Asset loaders etc
};

SceneManager:

SceneManager relies on Application, because it needs to pass Application reference to the current Scene.

#include "Application"
class SceneManager {
  public:
    void updateCurrentScene(Application& application);
    // Handling scene switching etc.
enter code here
  private:
    Scene currentScene;
};

In scene it would be then possible to:

void onUpdate(Application& application) {
    application.getSceneManager().doSomething();
}

Is it possible to remove circular reference and still have this "passing the managers down"? How would you do it?

Etwus
  • 549
  • 5
  • 15

1 Answers1

1

You can “forward declare” the classes in the header files.

class Application;

Instead of the full #include. You will need the #include in the cpp file (or really before you do anything with the forward declared class).

Buddy
  • 10,874
  • 5
  • 41
  • 58