Я читал о глобальных переменных и о том, насколько они плохи, но я застрял в одном месте из-за этого. Я буду очень конкретным, если я буду использовать глобальные переменные в этом сценарии.
Я работаю над движком игры. И мой двигатель состоит из множества менеджеров. Менеджеры выполняют определенные задачи: они хранят ресурсы, загружают их, обновляют и т.д.
Я сделал всех своих менеджеров синглом, потому что для них требуется доступ к многим классам и функциям. Я думал об удалении синглтона, но я не знаю, как я не могу его получить и получить доступ к этим менеджерам.
Вот пример того, что я пытаюсь сказать (им плохо на английском, извините):
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, который выигрывает у меня некоторое время компиляции. Как я могу получить такой результат без globals, который упростит интеграцию в качестве этого. Синглтон не является потокобезопасным, но добавление потоков не займет много времени.
Надеюсь, я мог бы объяснить эту проблему.
Спасибо заранее,
Гасим Гасымзада