2013-08-19 138 views
1

我有一个关于C++中的虚函数的问题。我花了最后一小时搜索,但我很快就无处可去,我希望你能帮上忙。
我有一个类来处理传输和接收数据。我希望这个类尽可能模块化,因此我想用抽象/虚拟方法来处理接收到的消息。
尽管我知道我可以创建一个新类并覆盖虚拟方法,但我并不想真正创建大量新类,这些类都以不同方式实现方法。在Java中,您可以在声明对象时使用侦听器和/或重写代码体中的抽象方法,如在示例中所示。覆盖代码体中的虚函数

JTextField comp = new JTextField(); 
comp.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     //Handler Code 
    } 
}); 

这是可能的C++或有没有更好的方法来解决这类问题?

干杯和非常感谢提前,
克里斯。

+0

Java方法是创建只写代码的好方法。 –

回答

3

有看看这个其他SO发布Does C++0x Support Anonymous Inner Classes的问题听起来相似。

函子(函数对象)或lambda可能是合适的选择。

+0

这取决于函数addActionListener如何工作 - 如果它存储从基类派生的对象,那么使用lambdas或functor将不起作用。 –

+0

谢谢德鲁:),大大的帮助。 – Chris192

1

在C++中,你需要声明一个新的类:

class MyActionListener: public ActionListener 
{ 
    public: 
     void actionPerformed(ActionEvent evt) { ... code goes here ... } 
}; 
+2

或者改变设计采取某种多态函数对象。 – juanchopanza

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(); 
}