1

私の現在のプロジェクトの 1 つで、多数の実装があるインターフェイスが定義されています。これは、多くのプラグインを備えたプラグイン インターフェイスと考えることができます。

これらの「プラグイン」はそれぞれ、ネットワーク プロトコルで異なるメッセージ タイプを処理します。そのため、新しいメッセージを受け取ると、プラグインのリストをループし、誰がそれを処理できるかを確認し、インターフェイスを介して呼び出します。

私が苦労している問題は、すべての実装を配列/ベクトル/その他に割り当て、初期化、および「ロード」する方法です。

現在、main() ですべての「プラグイン」を宣言してから、「plugin_manager.add_plugin(&plugin);」を呼び出しています。それぞれについて。これは理想的とは言えません。

実際の質問: 1. この種のことに対する標準化されたアプローチはありますか? 2. プラグインがプリロードされた配列 (グローバル?) を定義する方法はありますか? 3. 私はこれについて完全に間違った方法で行っていますか? この種の問題に対する他の (より良い?) アーキテクチャ オプションはありますか?

ありがとう。

編集:

これはコンパイルされます(醜いコードを許してください)...しかし、ハックのようです。一方、割り当ての問題を解決し、main() をクリーンアップします...これは有効な解決策ですか?

class intf
{
public:
    virtual void t() = 0;
};

class test : public intf
{
public:
    test(){}
    static test* inst(){ if(!_inst) _inst = new test; return _inst; }
    static test* _inst;
    void t(){}
};
test* test::_inst = NULL;

intf* ints[] =
{
    test::inst(),
    NULL
};
4

2 に答える 2

2

何らかの形のスマート ポインターをコンテナーに格納します。プラグインを動的に割り当ててコンテナーに登録し、後で使用できるようにします。

解決策の 1 つの可能なアプローチは、プラグインがデコードできる何らかの形式のメッセージ ID がある場合、その ID からそれを処理するプラグインへのマップを使用することです。このアプローチにより、入力メッセージを指定してプラグインをすばやく検索できます。

于 2012-10-23T03:49:34.410 に答える
2

より少ないコードを記述する 1 つの方法は、インスタンス化関数にテンプレートを使用することです。次に、実装クラスごとに 1 つの関数を用意する代わりに、1 つ作成してインターフェイスに配置するだけで済みます。

class intf
{
public:
    virtual void t() = 0;

    template<class T>
    static T* inst()
    {
        static T instance;
        return &instance;
    }
};

class test : public intf { ... };

intf* ints[] =
{
    intf::inst<test>(),
    NULL
};

上記のコードは、コードにある 2 つのバグも回避しますinst()。もう 1 つは、コンストラクターが静的メンバーを に設定することNULLです。

他のヒントは、あなたが持っている「シングルトン」パターンについてもっと読むことです。状況によっては役立つこともありますが、一般的には使用しないことをお勧めします。

于 2012-10-23T04:50:11.190 に答える