首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UML图的<<bind>>与std::bind()

UML图的<<bind>>与std::bind()
EN

Stack Overflow用户
提问于 2018-08-15 07:14:12
回答 1查看 2.3K关注 0票数 1

到目前为止,在两个特定的repos之间,我使用了一个接口类(带有继承),最近我用使用std:: function () & std::bind()的回调函数替换了这个类。

使用旧的类似接口的方法,我最终得到了以下结果:

代码语言:javascript
复制
//a.hpp
#include "b.hpp"

class A{    

  public:
    A(InterfaceB* pb) : m_pb(pb) {};        
    void bar(){m_pb->foo();};
  private:
    InterfaceB* m_pb;        

};

--

代码语言:javascript
复制
//b.hpp
#include <iostream>

class InterfaceB{

  public:
    virtual void foo() = 0;
};

class B : public InterfaceB {
  public:
    void foo(){ std::cout << "hi"<< std::endl; };

};

--

代码语言:javascript
复制
//main.cpp
#include "a.hpp"
#include <memory>

int main(){

  InterfaceB* pb = new B;
  A a(pb);
  a.bar();
  delete pb;
}

--

在UML中,我会将上面的小例子画成这样:

为了减少repos (这里是A和B类)之间的依赖,我删除了接口,转而使用了函数包装器。

代码语言:javascript
复制
//a_callback.hpp
#include <functional>

class A{    
  public:
    void setBcallback(std::function<void(void)> callback){m_callback = callback;};
    void bar(){m_callback();};
  private:
    std::function<void(void)> m_callback;

}

--

代码语言:javascript
复制
//b_callback.hpp
#include <iostream>

class B {

  public:
    void foo(){ std::cout << "hi"<< std::endl; };

}

--

代码语言:javascript
复制
//main.cpp
#include "a_callback.hpp"
#include <functional>

int main(){

  A a;
  B b;
  a.setBcallback(std::bind(&B::foo, &b));
  a.bar();
}

--

对我来说,这是一个棘手的问题,我对谷歌发现C++的std:: bind ()/std::function()和UML的<< bind >>之间的相互转换没有什么运气。所以我的问题是,如何在类图上展示函数包装器的用法?根据我发现的情况,我可能会这么做:

但它只是感觉松散和不足。任何帮助都将不胜感激!

这个问题以前被标记为一个复制,下面是:如何在UML类图中表示回调。但是我的问题是特定于C++的,并且说‘原件’被标记为Java,不幸的是我没有得到帮助。我的问题不是“如何在UML中显示回调”,而是“如何在UML中显示std::bind()”,我认为这更棘手。这里有两种情况,一种是使用bind()设置函数包装器,第二种是通过包装器进行调用。我只是看不出上面那条线是如何解决这个具体问题的。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-24 20:25:07

UML绑定

<<bind>>依赖关系指的是UML模板绑定:

TemplateBinding是一个TemplateableElement和一个模板之间的关系,它指定了模板的形式TemplateParameters的实际ParameterableElements的替代。

模板绑定是一个特殊的实现依赖项,它表明类是模板的专门化,并规定了模板的substition。

一个典型的例子是:

代码语言:javascript
复制
using void_function = std::function<void(void)> ; 

C++绑定

在C++中,std::bind()将参数绑定到可动态调用的对象。--这是一个完全不同的语义。

如果您想要在UML中显示这一点,它就不会那么有帮助了。你可以:

  • 显示绑定返回的匿名类型是一个可调用参数的模板实例化,其中一个参数替换为B(与上面的图非常相似)。
  • 如果有用的话,说明这个匿名类依赖于B。
  • 如果有用的话,请显示从A到这个匿名类的可选关系(0..1),了解到其他匿名类是可以选择的关系(如果您想在图上说明几个并明确它们是相互排斥的,可以使用OCL约束)。

不幸的是,不管你画什么,它都不会像你的C++设计那样通用和强大,而且它对理解也没有多大帮助。

建议:

UML图的目标不是以图形化的方式进行编程,而是对内部结构进行深入的洞察。所以我强烈建议保持简单:

  • 唯一真正的关系是A与回调的抽象可调用类之间的关系。那一定是在图表上。
  • 您还可以显示,这个抽象回调可以依赖于图表中的其他相关类。对这些依赖关系的注释可以用简单的话解释,依赖关系表示对成员函数的绑定。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51854401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档