当前位置:  开发笔记 > 编程语言 > 正文

在c ++中有任何事件/代理/接口/通知!什么?

如何解决《在c++中有任何事件/代理/接口/通知!什么?》经验,为你挑选了2个好方法。

说我有这些类ViewA和ViewB

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

@protocol ViewBDelegate{

- (void) doSomething();
}

然后在ViewB界面中:

id delegate;

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

viewB.delegate = self;

现在我可以从viewB调用doSomething到任何未知类型的委托.

[delegate doSomething];

"C++如何编程"是一个更糟糕的读物,无法找到演示基本设计模式的简单例子.

我在C++中寻找的是:

事件 ActionScript和java

或目标C中的代表或NSNotifications

任何允许A类,B类和C类知道ClassX didSomething()的东西!

谢谢



1> AraK..:

如果我是你,我不会使用函数指针来完成这个任务.将此选项留给大师;)

在Boost中,有一个叫做信号的美丽图书馆.它让您的生活更轻松!这是一个用法示例:

#include 
#include 
#include 
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 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 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.因此,list_of_actions中的函数类型是相同的,但我们可以将它连接到不同类型的类.所以:

bind(&A::A_action, a)

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

如果你正在做多线程的东西,那么使用它的姐妹信号2.

希望有所帮助.



2> sml..:

任何允许A类,B类和C类知道ClassX didSomething()的东西!

您可能正在寻找具有多种实现的信号和插槽:

促进

Qt的

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

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有