NS3中的Ptr類

(一)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指針。也用到了模板的思想。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章