Javaでは、インターフェースがあれば、次のようなことができます。
blah.setOnClickListner(new OnClickListner() {
public void clicked() { // do something }
}
C ++で同様のことを行うことはできますか?
Javaでは、インターフェースがあれば、次のようなことができます。
blah.setOnClickListner(new OnClickListner() {
public void clicked() { // do something }
}
C ++で同様のことを行うことはできますか?
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 ではラムダの使用が可能になります (コンパイラーがローカル クラスを作成します)。