2

Javaでは、インターフェースがあれば、次のようなことができます。

blah.setOnClickListner(new OnClickListner() {
     public void clicked() { // do something }
}

C ++で同様のことを行うことはできますか?

4

1 に答える 1

5

C++ はローカル クラスをサポートします。構文は他のクラス型と同じですが、メンバー関数と静的メンバー変数はクラス本体内で定義する必要があり、後で宣言および定義する必要はありません (囲んでいる関数の外からメンバーに名前を付ける方法はありません)。

C++11 以降では、テンプレート型パラメーターとして使用できるようになったため、はるかに便利になりました。

次のようになります。

void Parent::func( EventProducer* blah )
{
    struct LocalListener : OnClickListener
    {
        virtual void clicked() { ... }
    };
    struct FancyLocalListener : OnClickListener
    {
        Parent* p;
        FancyLocalListener(Parent* p) : p(p) {} // but use better variable names, please ;)
        virtual void clicked() { p->func2(); }
    };

    blah->addOnClickListener(new LocalListener());
    blah->addOnClickListener(new FancyLocalListener(this));
}

(ただし漏れには注意)

ただし、C++ はこれにインターフェイスを使用しない傾向があります。より良い設計は、リスナーのファンクターを受け入れることです。これにより、C++11 ではラムダの使用が可能になります (コンパイラーがローカル クラスを作成します)。

于 2012-07-19T21:33:27.270 に答える