Перезапись виртуальных функций в теле кода

У меня вопрос о виртуальных функциях в C++. Я потратил последний час на поиски, но быстро ничего не получаю, и я надеялся, что вы сможете помочь.
У меня есть класс, который обрабатывает передачу и получение данных. Я хотел бы, чтобы класс был как можно более модульным, и поэтому я хотел бы создать абстрактный/виртуальный метод для обработки полученных сообщений.
Хотя я знаю, что могу создать новый класс и перезаписать виртуальный метод, я не на самом деле не нужно создавать большой массив новых классов, реализующих метод по-разному. В Java вы можете использовать прослушиватели и/или переопределять абстрактные методы в теле кода при объявлении объекта, как показано в примере.

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

Возможно ли это в С++ или есть лучший подход к такой проблеме?

С уважением и заранее большое спасибо,
Крис.


person Chris192    schedule 19.08.2013    source источник
comment
Подход Java — отличный способ создания кода, предназначенного только для записи.   -  person Pete Becker    schedule 19.08.2013


Ответы (3)


Посмотрите на этот другой пост SO Поддерживает ли C++0x анонимные внутренние классы так как вопрос звучит похоже.

Подходящей альтернативой могут быть функторы (функциональные объекты) или лямбда-выражения.

person Drew MacInnis    schedule 19.08.2013
comment
Это зависит от того, как работает функция addActionListener — если она хранит объект, производный от базового класса, то использование лямбда-выражений или функторов не будет работать. - person Mats Petersson; 19.08.2013
comment
Спасибо, Дрю :), Большая помощь. - person Chris192; 19.08.2013

В C++ вам нужно объявить новый класс:

class MyActionListener: public ActionListener
{
    public:
       void actionPerformed(ActionEvent evt) { ... code goes here ... }
}; 
person Mats Petersson    schedule 19.08.2013
comment
Или изменить дизайн, чтобы взять какой-то объект полиморфной функции. - person juanchopanza; 19.08.2013

На вопрос уже был дан ответ, но я подумал, что добавлю это для хорошей меры. Обсуждение 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();
}
person Peter R    schedule 19.08.2013