代码之家  ›  专栏  ›  技术社区  ›  Bach

在C++中有任何事件/委托/接口/通知!有什么事吗?

  •  7
  • Bach  · 技术社区  · 16 年前

    假设我有这些课 维瓦和ViewB

    在目标C中,我可以使用委托模式

    @protocol ViewBDelegate{
    
    - (void) doSomething();
    }
    

    然后在VIEWB界面中:

    id<ViewBDelegate> delegate;
    

    然后在VIEWA实现中,我设置了委托:

    viewB.delegate = self;
    

    现在,我可以从VIEWB调用DoSomething到任何未知的类型委托。

    [delegate doSomething];
    

    “C++如何编程”一直是一个更糟糕的阅读,找不到简单的例子来演示基本的设计模式。

    我在C++中寻找的是:

    • 事件 ActionScript与Java
    • 或目标C中的代表或NSnotifications

    任何能让A、B、C类知道X类的东西 做某事!!!!

    谢谢

    7 回复  |  直到 14 年前
        1
  •  9
  •   Khaled Alshaya    16 年前

    如果我是你,我不会使用函数指针来完成这个任务。把这个选项留给古鲁斯;)

    在Boost,有一个美丽的图书馆 signals . 它让你的生活更轻松!这是一个使用示例:

    #include <iostream>
    #include <boost/bind.hpp>
    #include <boost/signal.hpp>
    using namespace std;
    using namespace boost;
    
    struct A
    {   void A_action() { cout << "A::A_action();" << endl; }   };
    struct B
    {   void B_action() { cout << "B::B_action();" << endl; }   };
    struct C
    {   void C_action() { cout << "C::C_action();" << endl; }   };
    struct X
    {
        // Put all the functions you want to notify!
        signal<void()> list_of_actions;
        void do_something()
        {
            std::cout << "Hello I am X!" << endl;
            list_of_actions(); // send notifications to all functions in the list!
        }
    };
    int main()
    {
        X x;
        A a;
        B b;
        C c;
        x.list_of_actions.connect(bind(&A::A_action, a));
        x.list_of_actions.connect(bind(&B::B_action, b));
        x.list_of_actions.connect(bind(&C::C_action, c));
        x.do_something();
    }
    

    这将打印:

    Hello I am X!
    A::A_action();
    B::B_action();
    C::C_action();
    

    这就是它的工作原理。

    首先,您声明代表所在的位置:

    signal<void()> list_of_actions;
    

    然后,您将它“连接”到您想要调用的任何一组函数/函数/可调用对象。

    x.list_of_actions.connect(bind(&A::A_action, a));
    x.list_of_actions.connect(bind(&B::B_action, b));
    x.list_of_actions.connect(bind(&C::C_action, c));
    

    注意,我用过 bind . 所以,操作列表中的函数类型是相同的,但是我们可以将它连接到不同类型的类。所以:

    bind(&A::A_action, a)
    

    这个东西,产生一个可调用的东西,类型 void () 当我们宣布 list_of actions 早期的。当然,您可以在第二个参数中指定要应用此成员函数的实例。

    如果你在做多线程的事情,那就用它的姐妹 signals2 .

    希望有帮助。

        2
  •  5
  •   sml    16 年前

    任何允许A级,B级的 和C班一起知道X班 做某事!!!!

    可能你在找 signals & slots ,具有多个实现:

    我相信还有更多,但这些是我所知道的最重要的。

        3
  •  2
  •   Community Mohan Dere    9 年前

    没有代表/事件/等。

    您可以使用纯虚拟函数模拟接口,请参见 here 同样的问题。

    还有 function pointers …

    所以基本上你的问题的答案是否定的,在C++中没有任何一个(不知道最新的标准),但是有替代品和解决办法。

        4
  •  2
  •   Aoi Karasu    16 年前

    我个人喜欢 The Impossibly Fast C++ Delegates 作者:Sergey Ryazanov。非常整洁和易于使用的实现,声称比 Boost::function .

    您也可以在那里找到实现的事件。不过,我不使用它们。我使用.NET样式(sender、args)实现了自己的事件处理。

        5
  •  1
  •   anon    16 年前

    C++语言及其关联的标准库都不具有委托或事件。当然,有许多库可以实现这些东西,或者您可以自己实现它们。

        6
  •  1
  •   rhapsodyn    16 年前

    我只知道有一种方法叫做 回电 方法(实际上, 函数指针 )

    代表团?这只是一种打包的回调方法,看起来很先进

        7
  •  1
  •   ChrisW    16 年前

    “C++如何编程”是一个更糟糕的阅读,找不到简单的例子来演示基本的设计模式。

    我认为 the original Design Patterns book 包括如何使用C++实现每个模式的示例。