私はグローバル変数とそれがどれほど悪いかについて読んできましたが、そのために1つの場所に詰まっています。このシナリオでグローバル変数を使用すべきかどうかについて、私は非常に具体的になるでしょう。グローバル変数を使用する必要がありますか?
私はゲームエンジンで作業しています。私のエンジンは多くのマネージャーから構成されています。マネージャは特定のタスクを実行します - リソースを格納し、ロードし、更新します。
非常に多くのクラスと関数がアクセスする必要があるため、すべてのマネージャをシングルトンにしました。私はシングルトンを削除することを考えていたが、私はそれを持つことができないし、これらのマネージャにアクセスすることができないのか分からない。
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:ここ
は(英語、申し訳ありませんでイム悪い)私が言うしようとしているものの一例です。 cppclass 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());
}
};
エンティティ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ファイルに上記のファイルを含めていないです見ての通り。どのようにしてこのような結果を得ることができるのでしょうか?シングルトンはスレッドセーフではありませんが、スレッドの追加には時間がかかりません。
問題を説明できることを願っています。事前に
おかげで、
Gasim Gasimzada
謎はありません。グローバルを避ける方法は、それらを持たないことです。関数AがオブジェクトBにアクセスする必要があり、Bがグローバルでない場合、BはAへの引数として渡されます。これは、グローバルを持たない場合の操作です。必要なオブジェクトを関数(またはコンストラクタ)引数として渡します。 – jalf
あなたの投稿にはコメントできませんので、ここでコメントするつもりです。 @ jalf私は本当にグローバルが悪いと理解しています。代わりの強力な解決策は、値を関数や引数の引数に渡すことです。しかし、私はその場合に2つの大きな問題を抱えていますか?そこから、私はこれらのマネージャーをどこから入手しているのですか(実際にはコーディングを簡単にするラッパーです)。 @Daveは、これらすべてのオブジェクトを格納している「エグゼクティブ」オブジェクト(エンジンと呼ぶことができます)を作成し、関数またはc'torへの参照を渡します。しかし、私はそれをどのようにしていますか?私はそれをより簡単できれいにしたい。 – Gasim
実際には気にしない。私は方法を見つけました:)シングルトンを使用したかった唯一の理由は、各ソースファイルに依存性が非常に少ないためですが、今私は方法を見つけました。今すぐ仕事に戻る。 – Gasim