到目前为止,在两个特定的repos之间,我使用了一个接口类(带有继承),最近我用使用std:: function () & std::bind()的回调函数替换了这个类。
使用旧的类似接口的方法,我最终得到了以下结果:
//a.hpp
#include "b.hpp"
class A{
public:
A(InterfaceB* pb) : m_pb(pb) {};
void bar(){m_pb->foo();};
private:
InterfaceB* m_pb;
};--
//b.hpp
#include <iostream>
class InterfaceB{
public:
virtual void foo() = 0;
};
class B : public InterfaceB {
public:
void foo(){ std::cout << "hi"<< std::endl; };
};--
//main.cpp
#include "a.hpp"
#include <memory>
int main(){
InterfaceB* pb = new B;
A a(pb);
a.bar();
delete pb;
}--
在UML中,我会将上面的小例子画成这样:

为了减少repos (这里是A和B类)之间的依赖,我删除了接口,转而使用了函数包装器。
//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;
}--
//b_callback.hpp
#include <iostream>
class B {
public:
void foo(){ std::cout << "hi"<< std::endl; };
}--
//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()设置函数包装器,第二种是通过包装器进行调用。我只是看不出上面那条线是如何解决这个具体问题的。谢谢!
发布于 2018-08-24 20:25:07
UML绑定
<<bind>>依赖关系指的是UML模板绑定:
TemplateBinding是一个TemplateableElement和一个模板之间的关系,它指定了模板的形式TemplateParameters的实际ParameterableElements的替代。
模板绑定是一个特殊的实现依赖项,它表明类是模板的专门化,并规定了模板的substition。
一个典型的例子是:
using void_function = std::function<void(void)> ;

C++绑定
在C++中,std::bind()将参数绑定到可动态调用的对象。--这是一个完全不同的语义。
如果您想要在UML中显示这一点,它就不会那么有帮助了。你可以:
不幸的是,不管你画什么,它都不会像你的C++设计那样通用和强大,而且它对理解也没有多大帮助。
建议:
UML图的目标不是以图形化的方式进行编程,而是对内部结构进行深入的洞察。所以我强烈建议保持简单:
https://stackoverflow.com/questions/51854401
复制相似问题