在Java中,如果我有一个接口,我可以这样做:
blah.setOnClickListner(new OnClickListner() {
public void clicked() { // do something }
}
Run Code Online (Sandbox Code Playgroud)
我可以在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));
}
Run Code Online (Sandbox Code Playgroud)
(但注意泄漏)
但是,C++倾向于不使用接口.更好的设计是为侦听器接受一个函子,在C++ 11中允许使用lambdas(编译器为你创建本地类).