在Java中,如果我有一个界面,我可以这样做:
blah.setOnClickListner(new OnClickListner() {
public void clicked() { // do something }
}
我可以在C ++中做类似的事情吗?
答案 0 :(得分: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中允许使用lambdas(编译器为你创建本地类)。