class//Bullet

程式設計的隱喻,和使用者心智模式的隱喻,不一定要相同。
在此。我們使用槍械打靶的隱喻來設計整個量測機制。

這一個部份是子彈的彈頭。用來在裝載量測的資料用的。

  • 類別裡的i()和o()分別是input和output
    input會輸入float或CString兩種資料型態,利用overload的機制設計
  • output則設計成兩種不同的函數oStr和oFlt,分別取得float和CString。
  • 設計一個「最後更新時間」,紀錄資料寫入時的時間,通常十種光學數據會幾乎同時寫入。
  • 空物件判別則是配合其它資料結構上的運算而設計的,在細部設計時會詳細介紹
  • 內部轉態,float to string和string to float兩種方向的轉換。
  • ShowData系列,提供兩種顯示格式方便程式不同的部份呼叫。

Bullet.h

#ifndef BULLET_H
#define BULLET_H

#include <vector>
#include <iterator>

enum ValueKind{VluK_Lv, VluK_Sx, VluK_Sy, VluK_T, VluK_Duv, 
               VluK_Du, VluK_Dv, VluK_X , VluK_Y, VluK_Z, VluK_Total};

//Bullet 彈頭
class Bullet
{
//建解構子
public:
    Bullet();
    Bullet(const Bullet&);
    ~Bullet();

//資料儲存串
private:
    std::vector<float> m_vfValues;
public:
      const float oFlt(const ValueKind&) const;
    const CString oStr(const ValueKind&) const;
             void i(const ValueKind&, const float&);
             void i(const ValueKind&, const CString&);
//最後更新時間
private:
            CTime m_LastModifyTime;
public:
    const CString GetLastTime() const;

//空物件判別
private:
   BOOL isEmptyObj;
public:
       const BOOL IsEmpty() const;


//float, String轉換
private:
      const float str2flt(CString ) const;
    const CString flt2str(const float& ) const;
//運算子
public:
             void operator= (const Bullet&);
    const CString ShowDataReport() const;
    const CString ShowData() const;
};

#endif

Bullet.cpp

用兩種方式檢查物件是否為空

用迴圈檢查每個值是否為0,比較花時間,卻比較準確。使用一個bool來記錄每個值是否曾經寫入,在檢查是否為空時,速度比較快,卻有不準的風險存在。
在此使用ASSERT配合條件編譯,可以在debug版保留程式正確性,在release時保留程式效率。
const BOOL Bullet::IsEmpty() const
{
#ifdef _DEBUG
    BOOL B(TRUE);
    for (std::vector<float>::const_iterator vitor = m_vfValues.begin();  vitor != m_vfValues.end(); ++vitor)
    {
        if ( *vitor != 0.0 )
            B = FALSE;
    }

    ASSERT(B == isEmptyObj);
#endif
    return isEmptyObj;
}

文章分類維度