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