14.1. Overview of Dynamic Types

14.1. Overview of Dynamic Types

​ 本文主要描述了FastDDS中动态数据类型的相关内容,在文章的最后会有一个简短的例子来展示如何使用动态数据类型。

14.1.1. 涉及到的类

​ 下面这个类图描述了与动态数据类型功能关联的类的类关系图。


在这里插入图片描述

14.1.1.1. DynamicType

​ DynamicType是所有动态数据类型的父类,他代表了是一种动态数据类型,并且可被用于创建DynamicData对象。

​ 一个DynamicType的结构(就是他包含的成员DynamicTypeMember)在被创建后就无法修改。

14.1.1.2. DynamicTypeBuilderFactory

​ DynamicTypeBuilderFactory是DynamicTypeBuilder的工厂类,其是一个单例类,用于管理每个DynamicType和其对应的DynamicTypeBuilder。

​ DynamicTypeBuilderFactory会创建所支持的每个DynamicType类型的Builder对象,通过Builder对象,DynamicTypeBuilderFactory可以创建对应的DynamicType。

​ 某些简单的DynamicType可以直接被Factory创建而不需要通过Builder,因此可以省去创建这些Builder的步骤, Supported Types 链接中包含了这些可以不通过Builder直接创建的DynamicType。

14.1.1.3. DynamicTypeBuilder

​ DynamicTypeBuilder类用于在DynamicTypeBuilderFactory创建DynamicType之前对其进行配置,由于DynamicType在创建后就无法修改其内部成员结构,因此,其内部成员结构就是在Factory创建其之前由对应的Builder类对象进行配置(也就是说DynamicType类的结构是保存在DynamicTypeBuilder中的)。

​ DynamicTypeBuilder内部完成对所关联的DynamicType结构的配置后,DynamicTypeBuilderFactory 就可以根据该配置创建出对应的DynamicType。通过DynamicTypeBuilder对外接口 build() ,DynamicTypeBuilderFactory 可以获取到包含完整结构(DynamicTypeMember)的DynamicType。

​ 根据内存管理约束( Memory management),创建出来的DynamicType也是需要DynamicTypeBuilderFactory需要在最后删除这个DynamicType。

​ DynamicTypeBuilder可以被重复使用,如果DynamicType的内部结构,那么只需要调整DynamicTypeBuilder中的配置即可,但是,这个不会影响到已经被Factory创建出来的DynamicType。

14.1.1.4. TypeDescriptor

​ TypeDescriptor描述了DynamicType的内部结构,而DynamicTypeBuilder内部就存储了一个TypeDescriptor对象用作DynamicType的配置。

​ 当DynamicTypeBuilderFactory创建DynamicType的时候,会用到TypeDescriptor中的信息,并且会将TypeDescriptor拷贝到创建出来的DynamicType中。

14.1.1.5. DynamicTypeMember

​ DynamicTypeMember代表了DynamicType内部的成员的类型,而且DynamicTypeMember其实也是DynamicType。

​ 对于DynamicType中的每个子类型,都有一个对应的DynamicTypeMember对应该子类型。

14.1.1.6. MemberDescriptor

​ MemberDescriptor的功能类似TypeDescriptor,TypeDescriptor用于存储DynamicType的内部结构,而MemberDescriptor用于存储DynamicTypeMember的内部结构(例如名称,UID,默认值),并且MemberDescriptor也会在创建DynamicTypeMember时拷贝到DynamicTypeMember内部。

14.1.1.7. DynamicData

​ DynamicData代表DynamicType类型的一个实例对象(就如同int a;int是type,a是data),其提供了一组方法用于访存内部的值。

​ 有两种操作DynamicData的方法:

  1. 激活使能 DYNAMIC_TYPES_CHECKING 宏,这个宏会为每个DynamicType创建一个变量用于调试

  2. 不适用 DYNAMIC_TYPES_CHECKING,这种情况下,DynamicType的大小是被缩减的。

14.1.1.8. DynamicDataFactory

​ DynamicDataFactory是个单例类,用于创建和管理每个DynamicData。其使用DynamicType中的配置来创建该DynamicType的DynamicData实例对象。

​ 每个DynamicData都是通过DynamicDataFactory来创建的,当然也需要以来DynamicDataFactory来删除以防止内存泄漏。

​ 此外,还可以从TypeDescriptor创建一个 TypeIdentifier 和 (Minimal 或者 Complete) TypeObject 对象。

14.1.1.9. DynamicPubSubType

​ DynamicPubSubType是一个适配器类,可以让DynamicData在FastDDS上运行。DynamicPubSubType从 TopicDataType 接口继承而来,并且实现接口中的方法,这些方法用于在发布着和订阅者之间传输DynamicData。

14.1.2. Minimum example

​ 下面是一个简短的代码例子,用于展示使用DynamicType的方法以及前文提到的那些类是如何协作的。

// Create a builder for a specific type
DynamicTypeBuilder_ptr builder = DynamicTypeBuilderFactory::get_instance()->create_enum_builder();

// Use the builder to configure the type
builder->add_empty_member(0, "DEFAULT");
builder->add_empty_member(1, "FIRST");
builder->add_empty_member(2, "SECOND");

// Create the data type using the builder
// The builder will internally use the DynamicTypeBuilderFactory to create the type
DynamicType_ptr type = builder->build();

// Create a new data instance of the create data type
DynamicData_ptr data (DynamicDataFactory::get_instance()->create_data(type));

// Now we can set or read data values
data->set_int32_value(1);

// No need of deleting the objects, since we used the
// automanaged smart pointers

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值