C++ C++;0x是否支持匿名内部类?
假设我有C++98内置的监听器,它们是抽象的,例如必须实现ActionPerformed。在C++0x中,是否有一种类似于Java的方法:C++ C++;0x是否支持匿名内部类?,c++,c++11,C++,C++11,假设我有C++98内置的监听器,它们是抽象的,例如必须实现ActionPerformed。在C++0x中,是否有一种类似于Java的方法: button.addActionListener(new ActionListener() { public void actionPerfored(ActionEvent e) { // do something. } }); 谢谢不,你不能那样做 java C++,11的LAMBDAS非常有用。 < P>这是C++,不是Java,所以编写类似Java
button.addActionListener(new ActionListener() {
public void actionPerfored(ActionEvent e)
{
// do something.
}
});
谢谢不,你不能那样做
typedef int ActionEvent; // <-- just for testing
class ActionListener
{
public:
virtual void actionPerformed(const ActionEvent& event) = 0;
};
<>请注意,这与惯用的C++无关,在
不完全是,但是您可以用lambda来做一些事情。
i、 e:类ActionListener
{
公众:
typedef std::函数ActionCallback;
公众:
ActionListener(ActionCallback cb)
:_回调(cb)
{}
无效火灾(ActionEvent&e)
{
_撤回(e);
}
私人:
ActionCallback\u callback;
};
..
addActionListener(新建ActionListener(
[](ActionEvent&e)
{
...
}
));
<代码> > p>我认为我们可以用lambdas< /p>在C++中实现这一点。
button.addActionListener([]()->ActionListener*{ struct A: ActionListener {
void actionPerfored(ActionEvent e)
{
// do something.
}
}; return new A;}());
在宏中很容易把它包起来。问题是我有很多代码,使用java的方式来做,lambdas在这里不能帮助。你不能用java方式来做,所以你必须找到另一种方法,lambda可以帮助你。你有很多C++代码,使用java方法。试图假装C++是java的最佳选择,肯定会让你的生活变得糟糕。一个适当的C++接口当然会有任何这样的“AdActudiListor”,使用一个适当的函数,一个重载<代码>操作器()/<代码>,而不是重写一个虚拟函数,依赖于继承。{return new struct:ActionListener{…};}
。这实际上看起来很像Java版本。。。
#include <iostream>
void addActionListener(std::shared_ptr<ActionListener> listener)
{
ActionEvent e = 12;
listener->actionPerformed(e);
}
int main()
{
addActionListener(make_action_listener([](const ActionEvent& event)
{
std::cout << event << std::endl;
}));
}
class ActionListener
{
public:
typedef std::function<void(ActionEvent&)> ActionCallback;
public:
ActionListener( ActionCallback cb )
:_callback(cb)
{}
void fire(ActionEvent& e )
{
_callback(e);
}
private:
ActionCallback _callback;
};
..
button.addActionListener( new ActionListener(
[]( ActionEvent& e )
{
...
}
));
button.addActionListener([]()->ActionListener*{ struct A: ActionListener {
void actionPerfored(ActionEvent e)
{
// do something.
}
}; return new A;}());