ISO C++:如何设计活动?

发布于 2024-12-12 17:11:25 字数 680 浏览 0 评论 0原文

我知道在 C++ 中设计事件的两种方法:

1:使用回调:

typedef void (*callback_type)(void);

class my_class
{
  public:

    my_class(callback_type c)
    {
       m_callback = c;
    }

    void raise_event()
    {
       m_callback();
    }

  private:

    callback_type m_callback;
};

2:使用虚拟方法:

class my_class
{
   public:

   virtual void my_event() = 0;

   void raise_event()
   {
      my_event();
   }
};

class main_class : public my_class
{
   public:

   virtual void my_event()
   {
      // Handle EVENT.
   }
};

还有其他设计事件的方法或想法吗?

以及

在 ISO C++ 中设计事件的最佳模式是什么?

I know 2 ways for desiging an event in C++:

1: Using callbacks:

typedef void (*callback_type)(void);

class my_class
{
  public:

    my_class(callback_type c)
    {
       m_callback = c;
    }

    void raise_event()
    {
       m_callback();
    }

  private:

    callback_type m_callback;
};

2: Using virtual methods:

class my_class
{
   public:

   virtual void my_event() = 0;

   void raise_event()
   {
      my_event();
   }
};

class main_class : public my_class
{
   public:

   virtual void my_event()
   {
      // Handle EVENT.
   }
};

Is there any other way or other idea for designing events?

and

What is the best pattern for designing events in ISO C++?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清风无影 2024-12-19 17:11:25

您应该使用 Boost.Signals 或 Boost.Signals2。
要模拟这些,您可以使用 Boost.Function/std::function 的集合。
为了模拟这些,您可以使用类型擦除(因此虚拟函数路由)来提高灵活性。

请注意,这些都不是微不足道的,因此如果可能的话,您应该真正尝试使用现有的解决方案。

You should use Boost.Signals or Boost.Signals2.
To emulate those, you can use a collection of Boost.Function's/std::function's.
To emulate those, you use type erasure (so the virtual function route) for flexibility.

Note that none of that is too trivial, so you should really try to use an existing solution if possible.

一抹苦笑 2024-12-19 17:11:25

设计将取决于您的具体要求。有关一个很好的示例,请参阅 ACE Reactor

The design will depend on the specifics of your requirements. For a nice example, see ACE Reactor.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文