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;

  

 

posted @ 2022-08-31 11:30  atomxing  阅读(156)  评论(0编辑  收藏  举报