引言
对象模型的另外两个重要基类为Object
和ObjectBase
。
前者实现了多个类间的动态关联,后者实现了针对单个类的属性和trace
变量配置。
这两个基类有着一个共同的实现基础:元信息。
什么是元信息?
元信息是一组关于ObjectBase
及其子类的辅助信息。
每个ObjectBase
子类都有且仅有唯一的一组属于自己的元信息。
这些子类的元信息被集中存储在一个数据结构中,并以类名称作为唯一的标识符。
元信息包含的主要内容如下图:
元信息存储:IidManager类
ObjectBase
类和其所有子类的元信息都被统一存储在一个向量容器中,并以类名作为查找关键字。
IidManager
类是这个向量容器的管理和配置实体。
如何查找?
由于向量查找是一个效率很低的操作,时间复杂度为O(n)。
解决方法:建立索引(以空间换时间)
ObjectBase子类向上述向量结构添加自身元信息的同时,会保存改组元信息在向量结构中的索引值。这样一个子类就可以通过索引直接访问向量元素,时间复杂度为O(1)。
元信息管理接口:TypeId类
基于TypeId
的元信息存储结构
TypeId
除了保存索引之外,还定义了Object
和IidManager
之间的各种交互函数接口。
TypeId类的使用
初始化
//src/application/model/udp-echo-client.h
class UdpEchoClient:public Application
{
public:
static TypeId GetTypeId(void); //为子类创建TypeId对象、添加元信息
}
//src/application/model/udp-echo-client.h
TypeId
UdpEchoClient::GetTypeId(void)
{
static TypeId tid =
TypeId("ns3::UdpEchoClient") //类名称
.SetParent<Application>() //父类名称
.SetGroupName("Applications") //模块名
.AddConstructor<UdpEchoClient>()//构造函数
.AddAttribute("MaxPackets",...) //属性信息
.AddTraceSource("Tx",...) //trace信息
;
return tid;
}
TypeId运算符
- 赋值运算符
- 比较运算符
- 流插入
获取TypeId
ObjectBase::GetTypeId()
:获取一个ObjectBase
子类的TypeId
对象。TypeId::GetUid
:获取索引值。TypeId::GetName
:获取类名称。LookupByName()
:通过类名称查找TypeId