在此。我們使用槍械打靶的隱喻來設計整個量測機制。
這一個部份是子彈的彈頭。用來在裝載量測的資料用的。
- 類別裡的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;
}