1.官方描述(聚合的描述)

在ns-2中已经被广泛使用的继承和多态,它们被用来扩展协议模型,正是这种强力的认知才促成了NS-3的对象聚合系统。例如,特例化的TCP版本,如RenoTcpAgent就是通过重写方法继承自TcpAgent的。

然而,在ns-2中存在两个问题,即downcasts和“weak base class”。

1.Downcasting指的是,通过使用基类对象的指针,在运行时查询该指针来找到其类型信息,通常用来将基类的指针详细化地强制转换为子类的指针,用来去使用子类API的这样一个过程。

2. Weak baseclass指的是,一个类不能够有效地被重用或被继承,因为它缺少了一些必要的功能,导致开发者必须重新编辑修改这些基类,从而导致基类API调用的增生,而且其中一些可能会使得其全部子类出现不正确的语义。

ns-3 使用查询接口设计模式来避免这些问题。该设计基于 Component ObjectModel 和 GNOME Bonobo的基础。尽管现在替代构件的完全的二进制兼容性还不被支持,但我们努力简化语法和对模型编写者的影响。

====================

聚合的例子 Aggregation example

ns-3 中,class Node 是使用聚合的一个很好的例子。注意ns-3 中没有类Node的派生类(比如类InternetNode等),而是将构件(各种协议)聚合到节点中。

我们来研究一下Ipv4 协议是如何被加入节点的。

static voidAddIpv4Stack(Ptr node){Ptr ipv4 =CreateObject ();ipv4->SetNode (node);node->AggregateObject(ipv4);Ptr ipv4Impl= CreateObject ();ipv4Impl->SetIpv4(ipv4);node->AggregateObject(ipv4Impl);}

注意Ipv4 协议是用 CreateObject() 创建的。接着Ipv4 协议被聚合到节点中。

这样,基类Node 就不需要被编辑来使得用户使用指向基类Node 的指针来访问Ipv4接口;用户可以在程序运行时来向节点请求指向该节点的Ipv4 接口的指针。

注意:将多于一个的同一类型的对象聚合到某个ns3::object是编程错误。所以,如果想要存储一个节点的所有活动的sockets,聚合是不可选的。

2.自我经验:

很多时候我们新加入了一个模型,希望这个新模型和现有的节点模型或者设备模型可以建立一对一的联系,这个时候就用到了ns3中的聚合技术。但由于ns3具有自己的代码风格和代码标准,研究了很久才成功。下面先介绍一下如何加入新的模型,此处设新模型为uan-table,然后将新模型与节点node进行聚合的过程。

1)加入新模型

先贴出两个代码uan-table.h和uan-table.cc。

 uan-table.h#ifndef UAN_TABLE_H               //#ifnedef,#define和#endif都是ns3代码规范中需要写的东西#define UAN_TABLE_H
#include "ns3/object.h"               //加入ns3/object.h的引用,若不特殊加载,则类继承时则是c++中默认的object类
namespace ns3                           //命名空间为ns3,也可以再设置一级层次
{class UanRoutingTable: public Object{     //继承object类,才可以继承ptr指针,才可以用于聚合。public:static TypeId GetTypeId(void);       //所有的类都要有此函数来确定其类型,通过类型可以进行注册,创建UanRoutingTable();                       //构造函数virtual ~UanRoutingTable();             //析构函数采用虚函数的方式来实现多态效果uint16_t idd;void SetString(uint16_t i);               //简单的两个函数,用于检测聚合效果uint16_t getString();};
}
#endifuan-table.cc#include "uan-table.h"                         //引入相应头文件
#include "ns3/log.h"                            //引入日志头文件
NS_LOG_COMPONENT_DEFINE("UanRoutingTable");
namespace ns3{NS_OBJECT_ENSURE_REGISTERED(UanRoutingTable);   //此处注意,一定要写这个方法,这个方法将//这个类登记进入内核中,在ptr声明此类的时候才能可用TypeId UanRoutingTable::GetTypeId(void)  {                       static TypeId tid = TypeId("ns3::UanRoutingTable").SetParent ();return tid;                                 //定义此类的标志字符串}UanRoutingTable::UanRoutingTable()  {    }UanRoutingTable::~UanRoutingTable()   {    }void UanRoutingTable::SetString(uint16_t idd) {  this->idd = idd;}uint16_t UanRoutingTable::getString(){        //此方法可获得88这个数。this->idd = 88;return this->idd;}
}

新添加两个类需要注意这样一些问题:

  1. 由于新增加了两个文件,必须挑选相应的文件夹将其放入,我选择了scr/uan/model下面。挑选完之后,需要在wscript中进行登记,将.h和.cc文件写入相应位置中。
  2. 察看ns-3 coding style 要了解其代码风格。
  3. 要继承object类作为基类。因为可以从Object中继承一些特殊属性:ns-3的类型和属性系统;对象聚合系统;智能指针参考记数系统(Ptr)。

下面是在脚本中如何使用声明新类和聚合。

Ptr table=CreateObject();//注意,此处必须用CreateObject才可成功聚合,否则类型不匹配m_sinks.Get(0)->AggregateObject(table);   //将其与节点聚合std::cout << m << "test:" <<m_sinks.Get(0)->GetObject()->getString()<< std::endl;    //测试是否可以正确取到聚合后对象的函数

这是就可看到正确输出了0test:88

聚合成功。

NS3学习记录(四)--加入新模型及聚合Aggregate相关推荐

  1. MySQL学习记录 (四) ----- SQL数据管理语句(DML)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  2. Kafka学习记录(四)——消费者

    Kafka学习记录(四)--消费者 目录 Kafka学习记录(四)--消费者 对应课程 Kafka消费者工作流程 消费方式和流程 消费者组原理 消费者组初始化流程 消费者组详细消费流程 重要参数 ka ...

  3. leveldb 学习记录(四)Log文件

    前文记录 leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice leveldb 学习记录(三) MemTable 与 Immutable Memtable le ...

  4. NS-3 学习之信号传播损失模型之RangePropagationLossModel范围传播损失模型

    信号覆盖范围或者信息传输范围与传播损失模型有关,下面介绍一下ns-3 中的传播损失模型: 在源码包中的/src/propagation/doc/propagation.rst 文档里有相关说明.目前n ...

  5. 学习记录1-一元线性回归模型(附上python代码)

    我们上应用回归分析(R语言版)这门课,老师每讲完一章就会带我们一起写这一章模型的代码,由于我们班同学大多会python不会R语言(包括我~~),所以代码都用python写. 这次写此书第二章.一元线性 ...

  6. 【故障诊断发展学习记录四——数字孪生与控制系统健康管理(DT PHM)】

    数字数字 目录 1. 数字孪生的起源 1.1 数字工程 1.2  模型贯穿决策 1.3 数字工程路线图 1.4 数字工程战略目标 2. 美军数字工程 2.1 生态系统全视图 2.2 支持采办的的完整视 ...

  7. python3.10官方文档学习记录四__赋值、比较运算

    1 先来个例子: Python 还可以完成比二加二更复杂的任务. 例如,可以编写 斐波那契数列 的初始子序列,如下所示: >>> # 斐波那契级数: ... # 两个元素的和定义了下 ...

  8. Linux 学习记录 四(Bash 和 Shell scirpt).

    一.什么是 Shell? 狭义的shell指的是指令列方面的软件,包括基本的Linux操作窗口Bash等,广义的shell则包括 图形接口的软件,因为图形接口其实也可以操作各种驱动程序来呼叫核心进行工 ...

  9. gRPC学习记录(四)--官方Demo

    了解proto3后,接下来看官方Demo作为训练,这里建议看一遍之后自己动手搭建出来,一方面巩固之前的知识,一方面是对整个流程更加熟悉. 官方Demo地址: https://github.com/gr ...

最新文章

  1. oracle删除unique key,【PK】Oracle 10g删除主键约束后无法删除唯一约束索引问题的模拟与分析...
  2. linux串口上网的简单实现,Linux串口上网的简单实现(3)
  3. C++ error:LNK2005 已经在*.obj中定义
  4. java method 注释_Java注解
  5. Golang实践录:简单的代码片段
  6. android 物联网 pdf,android复习资料(物联网141).pdf
  7. django 模型 使用 DateTimeFields 字段 auto_now_add 属性 实现 插入数据时 自动记录时间...
  8. Promise/A+规范
  9. 分享100个精美模板PPT模板,总有一款适合你
  10. raft算法 java实现_Raft 算法在分布式存储系统 Curve 中的实践
  11. koa教程--busboy模块
  12. excel两列数据对比找不同_对比excel,轻松学习python数据分析
  13. 【翻译工具】如何复活谷歌翻译(网页翻译)
  14. html中a做成按钮,css如何将超链接a设计成按钮样式
  15. oel6安装oracle报错,OEL6.1下安装Oracle 11gr2 RAC
  16. Monkey的测试原理和方法
  17. C++转换构造函数和隐式转换函数
  18. Python合并两个列表,使两个列表拼接起来
  19. lesson 17 always young 青年永驻-用in with表穿戴的用法-must be-
  20. 什么叫组网_什么是Mesh自组网?这篇文章是讲清楚了!

热门文章

  1. 路线指示箭头的生成——两个Vector3计算Distance,Rotation
  2. 芯片加密与解密技术方法
  3. TOLUA的文件结构
  4. 到底还有没有月薪3万以下的程序员?程序员工资真的这么高!
  5. 移动端的vm vh是什么
  6. SCSI——小型计算机系统接口
  7. Win7系统重装账户被禁用的解决方法
  8. 东方影都2003_东方影都旅游攻略|电影博物馆amp;外景街最in玩法,get了吗?
  9. 清算(清分)与结算的区别
  10. Java java.sql.SQLSyntaxErrorException:Duplicate column name ‘xxx‘问题解决