Следует ли мне использовать глобальные переменные?

Я читал о глобальных переменных и о том, насколько они плохи, но из-за этого я застрял в одном месте. Я собираюсь очень конкретно сказать, следует ли мне использовать в этом сценарии глобальные переменные.

Я работаю над игровым движком. А мой движок состоит из множества менеджеров. Менеджеры выполняют определенные задачи - они хранят ресурсы, загружают их, обновляют их и т. Д.

Я сделал всех своих менеджеров синглтоном, потому что многим классам и функциям требуется доступ к ним. Я думал об удалении синглтона, но не знаю, как я могу не получить его и получить доступ к этим менеджерам.

Вот пример того, что я пытаюсь сказать (я плохо говорю по-английски, извините):

Singleton.h

template<class T> class Singleton {
private:
    Singleton( const Singleton& );
    const Singleton& operator=( const Singleton& );

protected:
    Singleton() { instance = static_cast<T*>(this); }
    virtual ~Singleton() {}

protected:
    static T * instance;

public:
    static T &Instance() {
        return *instance;
    }

};

ScriptManager.h

class ScriptManager : public Singleton<ScriptManager> {
public:
    virtual void runLine(const String &line)=0;
    virtual void runFile(const String &file)=0;
};

PythonScriptManager.cpp

class PythonScriptManager : public ScriptManager {
public:
    PythonScriptManager() { Py_Initialize(); }
    ~PythonScriptManager() { Py_Finalize(); }

    void runFile(const String &file) {
        FILE * fp = fopen(file.c_str(), "r");
        PyRun_SimpleFile(fp, file.c_str());
        fclose(fp);
        fp=0;
    }

    void runLine(const String &line) {
        PyRun_SimpleString(line.c_str());   
    }

};

Entity ScriptComponent

#include <CoreIncludes.h>
#include <ScriptManager.h>
#include <ScriptComponent.h>

void update() {

    ScriptManager::Instance().runFile("test_script.script");
    //i know its not a good idea to open the stream on every frame but thats not the main concern right now.
}

Приложение

int main(int argc, const char * argv) {
    Application * app = new Application(argc, argv);
    ScriptManager * script_manager = new PythonScriptManager;
    //all other managers

    return app->run();
}

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

Надеюсь, я смогу объяснить проблему.

Заранее спасибо,
Гасим Гасимзада

11
задан skaffman 29 July 2011 в 17:07
поделиться