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 中允许使用 lambda(编译器为您创建本地类)。

于 2012-07-19T21:33:27.270 回答