2013-08-19 99 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(); 
}