我对C ++中的虚函数有疑问。我花了最后一小时搜索,但我很快就到了,我希望你能帮忙。
我有一个处理发送和接收数据的类。我希望这个类尽可能模块化,因此我想制作一个抽象/虚拟方法来处理收到的消息。
虽然我知道我可以创建一个新类并覆盖虚方法,但我真的不想创建一大堆新类,它们都以不同的方式实现该方法。在Java中,您可以在声明对象时使用侦听器和/或覆盖代码体中的抽象方法,如示例中所示。
JTextField comp = new JTextField();
comp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//Handler Code
}
});
这在C ++中是否可行,或者是否有更好的解决此类问题的方法?
欢呼和许多提前感谢,
克里斯。
答案 0 :(得分:3)
请仔细查看其他SO帖子Does C++0x Support Anonymous Inner Classes,因为问题听起来很相似。
Functors(函数对象)或lambdas可能是合适的替代品。
答案 1 :(得分:1)
在C ++中,您需要声明一个新类:
class MyActionListener: public ActionListener
{
public:
void actionPerformed(ActionEvent evt) { ... code goes here ... }
};
答案 2 :(得分:0)
这个问题已经得到了回答,但我认为我会把它扔进去。示例中链接的SO讨论很好,但主要集中在复制Java体验上。这是一种更惯用的C ++方式:
struct EventArgs
{
int param1;
int param2;
};
class network_io
{
typedef std::function<void (EventArgs)> Event;
typedef std::vector<Event> EventList;
EventList Events;
public:
void AddEventHandler(Event evt)
{
Events.push_back(evt);
}
void Process()
{
int i,j;
i = j = 1;
std::for_each(std::begin(Events), std::end(Events), [&](Event& e)
{
EventArgs args;
args.param1 = ++i;
args.param2 = j++;
e(args);
});
}
};
int main()
{
network_io ni;
ni.AddEventHandler([](EventArgs& e)
{
std::cout << "Param1: " << e.param1 << " Param2: " << e.param2 << "\n";
});
ni.AddEventHandler([](EventArgs& e)
{
std::cout << "The Param1: " << e.param1 << " The Param2: " << e.param2 << "\n";
});
ni.Process();
}