在接口的功能实现中

时间:2012-07-19 21:31:15

标签: c++

在Java中,如果我有一个界面,我可以这样做:

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

我可以在C ++中做类似的事情吗?

1 个答案:

答案 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(编译器为你创建本地类)。