重写代码体中的虚拟函数 我有一个关于C++中虚函数的问题。我花了最后一个小时寻找,但我很快就一无所获,我希望你能帮我 我有一个处理发送和接收数据的类。我希望该类尽可能模块化,因此我希望创建一个抽象/虚拟方法来处理收到的消息。 虽然我知道我可以创建一个新类并覆盖虚拟方法,但我并不想创建大量新类,所有这些类都以不同的方式实现该方法。在Java中,当声明对象时,可以使用侦听器和/或重写代码体中的抽象方法,如示例中所示 JTextField comp = new JTextField(); comp.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { //Handler Code } }); 这是C++中的可能还是有更好的方法来解决这个问题? 预祝大家干杯并致谢, 克里斯. C++中,需要声明一个新类: class MyActionListener: public ActionListener { public: void actionPerformed(ActionEvent evt) { ... code goes here ... } }; 在C++中,需要声明一个新类: class MyActionListener: public ActionListener { public: void actionPerformed(ActionEvent evt) { ... code goes here ... } };

重写代码体中的虚拟函数 我有一个关于C++中虚函数的问题。我花了最后一个小时寻找,但我很快就一无所获,我希望你能帮我 我有一个处理发送和接收数据的类。我希望该类尽可能模块化,因此我希望创建一个抽象/虚拟方法来处理收到的消息。 虽然我知道我可以创建一个新类并覆盖虚拟方法,但我并不想创建大量新类,所有这些类都以不同的方式实现该方法。在Java中,当声明对象时,可以使用侦听器和/或重写代码体中的抽象方法,如示例中所示 JTextField comp = new JTextField(); comp.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { //Handler Code } }); 这是C++中的可能还是有更好的方法来解决这个问题? 预祝大家干杯并致谢, 克里斯. C++中,需要声明一个新类: class MyActionListener: public ActionListener { public: void actionPerformed(ActionEvent evt) { ... code goes here ... } }; 在C++中,需要声明一个新类: class MyActionListener: public ActionListener { public: void actionPerformed(ActionEvent evt) { ... code goes here ... } };,c++,abstract,C++,Abstract,请看另一篇文章,因为问题听起来很相似 函子(函数对象)或lambda可能是合适的替代方案 请看另一篇文章,因为问题听起来很相似 函子(函数对象)或lambda可能是合适的替代方案 这个问题已经得到了回答,但我想我还是把这个问题考虑进去。示例中链接的SO讨论很好,但主要集中在复制Java体验上。这里有一个更习惯的C++方式: struct EventArgs { int param1; int param2; }; class network_io { typedef s

请看另一篇文章,因为问题听起来很相似


函子(函数对象)或lambda可能是合适的替代方案

请看另一篇文章,因为问题听起来很相似


函子(函数对象)或lambda可能是合适的替代方案

这个问题已经得到了回答,但我想我还是把这个问题考虑进去。示例中链接的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();
}
struct EventArgs
{
int参数1;
int参数2;
};
类网络
{
typedef std::函数事件;
typedef std::向量事件列表;
事件列表事件;
公众:
无效加法器(事件evt)
{
事件。推回(evt);
}
无效过程()
{
int i,j;
i=j=1;
标准::对于每个(标准::开始(事件),标准::结束(事件),[&](事件和e)
{
事件args args;
args.param1=++i;
args.param2=j++;
e(args);
});
}
};
int main()
{
网络;
添加事件编号([](事件编号S&e)
{

STD::CUT> P>这个问题已经得到了回答,但我认为我会把它放进去,好的。这个例子中讨论的是很好的,但是主要集中在复制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();
}
struct EventArgs
{
int参数1;
int参数2;
};
类网络
{
typedef std::函数事件;
typedef std::向量事件列表;
事件列表事件;
公众:
无效加法器(事件evt)
{
事件。推回(evt);
}
无效过程()
{
int i,j;
i=j=1;
标准::对于每个(标准::开始(事件),标准::结束(事件),[&](事件和e)
{
事件args args;
args.param1=++i;
args.param2=j++;
e(args);
});
}
};
int main()
{
网络;
添加事件编号([](事件编号S&e)
{

std::cout或更改设计以获取某种多态函数对象。或更改设计以获取某种多态函数对象。这取决于函数
addActionListener
的工作方式-如果它存储从基类派生的对象,则使用lambda或functor将不起作用。谢谢:),大帮助。这取决于函数
addActionListener
的工作方式-如果它存储从基类派生的对象,那么使用lambdas或functors将不起作用。感谢Drew:),大帮助。Java方法是创建只写代码的一种好方法。Java方法是创建只写代码的一种好方法。