2011-12-30 8 views
0

シンプルなQuakeのようなコンソールを実装したいと思います。この実装は、大きく運命3における実装に基づいている:地震のようなコンソールで自動コマンドの登録解除に適切なアプローチは何ですか?

class Console 
{ 
public: 
    ... 

    typedef boost::function<void(const Arguments&)> Callback; 

    void register_command(const std::string& name, const Callback& callback); 
    void unregister_command(const std::string& name); 
}; 

しかし、私はまた、アンロードすることができるロード可能なモジュールをサポートする予定。モジュールがアンロードされると、モジュールはそのコマンドの登録を解除する必要があります。それらを一つずつ登録解除するのは退屈でエラーが起こりやすいです。どのようにそれを自動化する?

答えて

1

あなたConsole::register_command関数はオブジェクトを返してもらいます。このオブジェクト(またはそのコピー)は、1つのメンバ関数、unregisterを持っています。これを呼び出すと、それが与えられた特定の登録の登録が解除されます。

したがって、各モジュールは、これらのオブジェクトのstd::vector<>を有することができます。デストラクタの一部としてそれらのすべてを登録解除することができます。

は、あなたが参照カウントとshared_ptrのようなオブジェクトを作成しない限り、オブジェクトのデストラクタは、それを行うにはしたくありません。または、C++ 11を使用していて、オブジェクトを移動専用にすることができます。オブジェクトがそれから作成されたConsoleオブジェクトを参照する必要があります

注意。したがって、生涯にわたる問題が発生する可能性があります。Consoleは破壊されていますが、作成されたこれらのオブジェクトのすべてが破棄されているわけではありません。これに対処するConsoleは常にshared_ptrstd::shared_ptrboost::shared_ptrかC++ 11)に格納されshared_from_this、の使用を含む可能性があります。登録オブジェクトはConsoleweak_ptrとなるので、まだ登録されているかどうかをテストできます。

関連する問題