9

假设我有这些类 ViewA 和 ViewB

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

@protocol ViewBDelegate{

- (void) doSomething();
}

然后在 ViewB 界面中:

id<ViewBDelegate> delegate;

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

viewB.delegate = self;

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

[delegate doSomething];

“C++ How to Program”读起来很糟糕,因为找不到简单的例子来演示基本的设计模式。

我在 C++ 中寻找的是:

  • 事件ActionScript 和 java
  • 或目标 C 中的委托或 NSNotifications

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

谢谢

4

7 回答 7

9

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

在 Boost 中有一个漂亮的库,叫做信号。它让您的生活更轻松!这是一个使用示例:

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

bind(&A::A_action, a)

这个东西产生了一个可调用的东西,其类型void ()与我们之前声明的类型相同list_of actions。当然,您在第二个参数中指定要应用此成员函数的实例。

如果您正在做多线程的事情,那么使用它的姐妹信号2 。

希望有帮助。

于 2010-06-13T09:20:22.450 回答
5

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

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

我敢肯定还有更多,但这些是我所知道的最重要的。

于 2010-06-13T09:14:17.340 回答
2

没有代表/事件/等。

您可以使用纯虚函数模拟接口,有关类似问题,请参见此处。

还有函数指针......

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

于 2010-06-13T09:04:27.627 回答
2

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

您也可以在那里找到实现的事件。但是,我不使用它们。我使用 .NET 样式(发送者、参数)实现了我自己的事件处理。

于 2010-06-13T09:23:26.423 回答
1

C++ 语言及其相关的标准库都没有委托或事件。当然有很多库实现了这样的东西,或者你可以自己实现它们。

于 2010-06-13T09:05:21.297 回答
1

我只知道有一种方法称为回调方法(实际上是函数指针)。

代表团?只是一种封装的回调方法,而且,看起来很高级

于 2010-06-13T09:05:39.870 回答
1

“C++ How to Program”读起来很糟糕,找不到演示基本设计模式的简单示例

我认为最初的设计模式书包括如何使用 C++ 实现每个模式的示例。

于 2010-06-13T09:22:39.043 回答