(一)ns3中的类
ns3是以c++的类为基础的系统,想要深刻理解学习ns3必须要学习它常用的类,以及类与类之间的关系。在ns3中,每个c++规则照样可以用,比如对象可以声明和实例化。总的来说,ns3中常用到c++的抽象,继承,封装,多态等概念。
(二)常用的以Object为基础的类
在ns3中,有三个特殊并且常用的基类:
• class Object
• class ObjectBase
• class SimpleRefCount
比如:类从Object继承,可以得到以下三个属性:
(1)ns3类型和属性的系统
(2)对象聚合的系统
(3)拥有智能指针的系统
可能有点抽象,不过我们可以看object.h文件。里边申明的函数和变量,总结起来就是上边三点。比如,里边声明的Ptr类型的函数:
Ptr就是智能指针,什么是智能指针?
(三 )c++中的智能指针
智能指针和普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生命期。在C++中,我们知道,如果使用普通指针来创建一个指向某个对象的指针,那么在使用完这个对象之后我们需要自己删除它。
例如:
ObjectType* temp_ptr = new ObjectType();
temp_ptr->foo();
delete temp_ptr;
很多材料上都会指出说如果程序员忘记在调用完temp_ptr之后删除temp_ptr,那么会造成一个悬挂指针(dangling pointer),也就是说这个指针现在指向的内存区域其内容程序员无法把握和控制,也可能非常容易造成内存泄漏。可是事实上,不止是“忘记”,在上述的这一段程序中,如果foo()在运行时抛出异常,那么temp_ptr所指向的对象仍然不会被安全删除。
在这个时候,智能指针的出现实际上就是为了可以方便的控制对象的生命期,在智能指针中,一个对象什么时候和在什么条件下要被析构或者是删除是受智能指针本身决定的,用户并不需要管理。
(4)ns3中的Ptr类
我们通过例子看一下IPV4协议怎么增加节点的。
static void
AddIpv4Stack(Ptr<Node> node)
{
Ptr<Ipv4L3Protocol> ipv4 = CreateObject<Ipv4L3Protocol> ();
ipv4->SetNode (node);
node->AggregateObject (ipv4);
Ptr<Ipv4Impl> ipv4Impl = CreateObject<Ipv4Impl> ();
ipv4Impl->SetIpv4 (ipv4);
node->AggregateObject (ipv4Impl);
}
我们通过CreateObject()方法建立了IPV4协议。这个方法在ns3的工作区间都可使用。返回Ptr指针。也用到了模板的思想。