freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

飛行器實時仿真算法研究本科畢業(yè)論文(編輯修改稿)

2024-10-02 20:04 本頁面
 

【文章內容簡介】 部肯定會有一個指向向量結構體的指針,那么這個指針該是什么屬性? const or nonconst ,鬼知道。 這時候通過一個視圖類和大量的 const 屬性來使代碼正常工作是件非常困難的事,無法預料什么時候會發(fā)生錯誤,而且編碼時代碼混亂不堪,這不是我想要 本科畢業(yè)設計論文 8 的。 所以僅有兩個類是不夠的 ,事實上需要 5 個類來實現需求分析中的功能。 GneVector 一般矩 陣類, AlmostVector 類, ConstVectorView 常視圖類,VectorView 類和 Vector 向量類,它們之間的繼承關系如下: 圖 31 繼承關系圖 根據類的抽象設計原則,最底層的類應該具有最通用的方法和數據,若需要使用未知的方法,可將此方法聲明為虛函數,留給派生類取定義。從上面的構架圖中可知, GneVector 類為最底層 基類 , 應該具有最通用的方法和數據。由于視圖類也是繼承于 GneVector,所以 GneVector 類不應該包涵數據,但是要用到有些方法要用到向量元素,所以可以通過虛函 數來取得派生類的數據。 GneVector 接口 根據以上的分析就可以寫出 GneVector 類的接口 //基類 template typename T class GneVector { public: //constructor GneVector(); virtual ~GneVector(); 本科畢業(yè)設計論文 9 //三個類都要重寫的方法 virtual const sliceamp。 getSlice() const = 0。 virtual const valarrayTamp。 constVal() const = 0。 //三個類公有的方法 size_t size() const { return getSlice().size() 。} size_t start() const { return getSlice().start() 。} size_t stride() const { return getSlice().stride() 。} size_t index(size_t i) const { return getSlice().start() + i*getSlice().stride() 。}。 .................... }。 以上代碼省略了很多函數和其具體實現,注意到所有的成員函數都是 const屬性函數,這是因為這些方法都是對 Vector、 VectorView、和 ConstVectorView類進行泛化得出的共有方法,至于其他的方法應該根據特點歸入某個類,然后具體實現。 ConstVectorView 接口 由于 ConstVectorView 繼承于基類,有些方法已經在基類中實現,所以該類本身比較簡單,提供構造函數,視圖函數,和元素存取功能即可。 template typename T class ConstVectorView : public GneVectorT //常視圖 { private: const valarrayT* pVectorData_。 slice viewSlice_。 public: //重寫基類的虛函數 virtual const sliceamp。 getSlice() const。 virtual const valarrayTamp。 constVal() const 。 //以下兩個構造函數是為了 //Vector ConstVectorView //VectorView ConstVectorView //ConstVectorView ConstVectorView ConstVectorView(const GneVectorT amp。 vec) 。 ConstVectorView(const GneVectorT amp。 vec, const sliceamp。 s)。 本科畢業(yè)設計論文 10 ................. T operator [](size_t i) const { return cref(i) 。} T operator ()(size_t i) const { return cref(i) 。} }。 // end of class ConstVectorViewT AlmostVector 接口 AlmostVector 類的存在時為了對 Vector 類和 VectorView 類解耦,也可以大幅度提高代碼的復用率。接口大 致如下: //VectorView and Vector should inherit this class template typename T class AlmostVector : public GneVectorT { public: AlmostVector()。 virtual ~AlmostVector()。 //override this function in VectorView and Vector virtual valarrayTamp。 val() = 0。 //VectorView and Vector 的共有函數 //subVector ConstVectorViewT subVector(const slice amp。 s) const。 … }。 Vector 接口 由于前面的設計比較合理,現在對 Vector 類編碼時非常簡單,很多方法已經通過兩個基類實現過了。但是注意 Vector 類包含向量元素 , 并且提供盡可能多的構造函數,以便使用能使不同的數據類型轉為 Vector 類型。接口大致如下: //向量類 template typename T class Vector : public AlmostVectorT { private: //保存向量元素 valarrayT vectorData_。 本科畢業(yè)設計論文 11 slice slice_。 public: //重寫基類的虛函數 virtual const sliceamp。 getSlice() const 。 virtual const valarrayTamp。 constVal() const。 //由 STL valarray 構造 Vector(const valarrayTamp。 val) 。 Vector(const valarrayTamp。 val, const sliceamp。 s)。 ................................ Vector(const T * p, size_t n) 。 //以下兩個構造函數是為了 //Vector Vector //VectorView Vector //ConstVectorView Vector Vector(const GneVectorT amp。 vec) 。 Vector(const GneVectorT amp。 vec, const slice amp。 s)。 … }。 VectorView 接口 template typename T class VectorView : public AlmostVectorT //可變視圖 { private: valarrayT* pVectorData_。 slice viewSlice_。 public: //重寫基類的虛函數 virtual const sliceamp。 getSlice() const 。 virtual const valarrayTamp。 constVal() const。 //下面兩個構造函數是為了 //Vector MatrixView //VectorView VectorView VectorView(AlmostVectorT amp。 vec) 。 本科畢業(yè)設計論文 12 .................... virtual valarrayTamp。 val() 。 …… . }。 補充說明 上面接口中使用到的 slice 類型是 C++標準庫中 valarray 類的組成部分,大致結構如下 : class slice { public: ................... protected: size_t _Start, _Len, _Stride。 }。 可以看到 slice 類主要保存三個數據,即 1. 向量的第一個元素的下標, _Start 2. 向量的長度, _Len 3. 步長,即每個元素之間 的間隔, _Stride 這種類型可以完全使用到我們的視圖類中,這也是為什么選擇 valarray 模板作為內置向量類型的原因之一。 上面對接口的陳述中沒有提到 Vector 類型的輸入和輸出,這里作已簡要說明。由于輸出只需要對對象具有只讀權限即可,而輸入則要求對對象的讀寫權限。 所以輸出可以放到 GneVector 底層基類中,作為所有派生類的共有函數。而輸入則需放到 AlmostVector 類中,作為 Vector 和 VectorView 類的共有函數。決定某個函數放在基類還是派生類需要很周全的考慮,基類和派生類可以比作一個 杠桿,不能一頭很重,一頭很輕,代碼失衡會導致后期的編碼和維護非常困難。 輸入輸出函數的聲明如下: friend std::ostreamamp。 operator ( std::ostream amp。os, const GneVectorT amp。avec)。 friend std::istreamamp。 operator ( std::istream amp。is, AlmostVectorT amp。avec)。 最后介紹本類初始化時的一個特點。 初始化一個向量對象有很多種方法,最直接的方法是給每一個元素賦值,如下: for(size_t i=0。 iN。 ++i) { 本科畢業(yè)設計論文 13 v[i] = /* whatever */ } 但是這樣很不方便,尤其是當我們想給 v 賦一系列不同的值時,在 for 循環(huán)中是比較麻煩的。當然也可以用下面這種方式實現: double var[5] = { , , , 1, }。 Vectordouble v(var, 5)。 但這種方法的不便之處是使用了局部變量。依我來看,最理想的 方法是把初始化列表放到構造函數中,如下: Vectordouble v({ , , , 1, }, 5)。 // Error – invalid 不幸的是這不符合 C++的語法規(guī)則,變通一下,使用如下方式: Vectordouble v((double[]) { , , , 1, }, 5)。 // Usually OK 這種方法通常是不會錯的,但是也有可能有些編譯器會報錯,我也不知道這算不算標準 C++語法,因為沒有一本 C++書 (我讀過的 )講到過這種初始化方式。 為了解決這個問題,我使用了 操作符,把我的類對象當做標準輸出。從而可以使用如下方式進行初始化: Vectordouble v(5)。 v , , , 1, 。 //或者 v 1 。 輸入數據的個數必須和對象的大小一致,否則會觸發(fā)庫中的出錯處理函數。上面的方式的優(yōu)點是,初始化列表里的數據不限制為常量。通常來說,初始化列表必須是在編譯時可確定的,但用上面的方式,初始化列表里的 元素可以使變量,甚至是一個函數的返回值,只要能轉換為 Vector模板對應的實例化類型就可以了。當然 v也可以在其他任何時候重新使用此方法賦值。 另外,由于使用標準庫的 valarray模板,所以在所有這些類的實現中,甚至沒有主動使用 C++標準內存分配和刪除操作符 new, delete,一個也沒有出現。 最后, GneVector類和 AlomostVector類都含有純虛函數,所以無法實例化,這正是我想要的,給用戶使用的類是 Vector、 VectorView和 ConstVectorView三個類。 矩陣 GSL 提供的矩陣類型使用起來非常麻煩,由于是對 c 語言中的數組進行包裝,所以用戶時刻都要注意內存的變化,花費大量精力減少內存泄露 ,并且每種數據類型都有不同的函數版本,且不支持用戶自定義類型,所以我決定使用 GSL的算法,重寫構架矩陣類,并且給出 C++的接口,支持多種類型,包括未知的用戶自定義類型,盡量減少用戶對程序本身的維護工作量,使用戶能專注于算
點擊復制文檔內容
畢業(yè)設計相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1