NS3 Object类
以下内容是基于《开源网络模拟器ns-3 架构与实践》的学习笔记
Object类是大部分网络元素类的基类,继承了SimpleRefCoumt类和ObjectBase类,实现了对象聚合功能。
有些Object子类的使用涉及很多其他子类的对象,通过对象聚合技术,统一其他子类对象指针的操作方式。
传输层(Protocol)和网络层(Protocol)对象指针存贮在聚合数组(指针数组)中。
大部分协议对象(Protocol)指针都存贮在聚合数组。
但是应用层(Application)、链路层(NetDevice)对象指针分别单独存贮在两个指针向量容器(std::vector)中。
1、对象聚合的技术原理
1)对象聚合简化了关联对象的获取方法。集合数组中任意两个对象都可以使用Object::GetObject()互相访问,只需提供对象所属的类名称即可。
Prt<IpL4Protocol> ipL4Proto=node->GetObject<IpL4Protocol>()//应该是获取传输协议指针
Prt<Node> node=ipL4Proto->GetObject<Node>()//获取当前节点指针 |
|
2)程序开发简便
对象聚合技术的原理:主要是通过在基类Object用类模板定义提取、设置函数、和存贮操作,比如Object::GetObject()函数,从而Object子类不需要定义多个名称各不相同的提取、和设置函数去关联对象。值得注意的是,在Object基类定义了一个Object指针数组(聚合数组),将关联对象的存取、提取和设置都统一起来了。
1.统一存储:所有关联对象指针均以Object指针类型存储在聚合数组中。
2.统一提取方法:GetObject()函数用于从聚合函数中查找并返回指定对象指针。
3.统一设置方法:AggregateObject()函数用于向聚合数组添加元素。
2、对象聚合的适用范围
一个类在对象聚合数组中最多只能有一个示例对象(GetObject()函数是通过类名称进行查找,如果一个类有多个对象,同一个类的多个对象拥有相同的类名称,函数就无法定位到相应的对象)。所以只用于传输层和网络层,这种只能拥有一个对象的层次。需要多个对象的协议通过向量容器来存储。
对象聚合牺牲效率换取对象关联的灵活性。(?感觉还是有点不大懂,先做个标记)
3、Object的创建获取
1)Object对象创建
CreateObject()函数:创建一个对象,并返回创建对象的指针。
ObjectFactory类:一次性创建多个Object对象(广泛应用在助手类中)。步骤如下:
1创建ObjectFactory对象
2调用ObjectFactory类的SetTypeId()和Set()函数设置所创建对象的类名称和属性值。若不用Set()函数,则使用默认属性值。
3调用ObjectFactory::Create()函数创建对象。
2) 获取Object
使用GetObject()函数从聚合数组获取指定对象的指针。
GetObject()函数的技术原理(?有点不大明白)
————————————————
版权声明:本文为CSDN博主「xihuanmadaima」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xihuanmadaima/article/details/121017756
举个例子:
Ptr<Node> n = GetObject<Node>();//获取当前节点 Ptr<MobilityModel> mobility = n->GetObject<MobilityModel>();//获取当前节点的运动状态 NS_ASSERT(mobility != 0); Vector myvelocity = mobility->GetVelocity();//获取当前节点的速度 /* Vector myposition = mobility->GetPosition();//获取当前节点的位置 double x1 = myposition.x; double y1 = myposition.y; */ double Vx1 = myvelocity.x; double Vy1 = myvelocity.y;
|