類和對象實際上是C++中的概念,但是在嵌入式C語言中,有時的確需要定義類和對象來方便我們的程序設計,因此我們有時候也借鑒一些C++的思想。
比如我們要做車窗控制,我們可以建立一個車窗類,然後再分別定義左前、右前,左後和右後這四個車窗對象。
建立一個車窗類
typedef struct
{
st_win_drv Drv;
st_win_cmd Cmd;
st_win_st St;
st_win_lock Lock;
st_win_runtime Runtime;
st_win_block Block;
……
} st_win;
建立一個車窗類的目的是,為了把車窗相關參數都提煉出來,也就是車窗的通用屬性,都歸入到整個車窗類當中。這樣,相當於把整個車窗的所有相關參數都打包規整到了一起,再採用指針(*)或者傳址(&),那麼對於這些參數的管理、調用和傳遞都會方便很多。
這裡再解釋一下,這幾個參數的具體含義:
st_win_drv:車窗驅動,主要用於辨別驅動對象;
st_win_cmd:車窗接收指令,比如手動升降窗、自動升降窗等;
st_win_st:車窗當前的運動狀態;
st_win_lock:車窗鎖止保護,主要用於車窗電機的反轉保護;
st_win_runtime:車窗運動時間;
st_win_block:車窗電機堵轉;
關於車窗的實際參數還遠不止這些,有時還需要根據某些特殊功能,做一些特殊的參數設計。這裡就不一一列舉了。當然,關於類的設計,實際上這裡還是數據結構的設計,也要注意一些基本原則。
數據結構的設計原則
不要設計面面俱到的數據結構。相關的一組信息,才是構成一個結構體的基礎,結構的定義應該可以明確地描述一個對象,而不是一組相關性不強的數據集合。設計結構時應力爭使結構代表一種現實事務的抽象,而不是同時代表多種。結構中的各元素應代表同一事務的不同層面,而不應把描述沒有關係或關係很弱的不同事務的元素放到同一結構中。
你像這裡,就不適合把車窗控制開關的參數揉到這個車窗類里去。
其實,上面的車窗類還並不是真正意義上的類,還只能算是個結構體。因為在這個所謂的「車窗類」里,還只有數據成員,而並沒有成員函數。下面我們就將為其添加、設計相應的成員函數。
將C語言中的結構體演變成C++中的類
typedef struct
{
st_win_drv Drv;
st_win_cmd Cmd;
st_win_st St;
st_win_lock Lock;
st_win_runtime Runtime;
st_win_block Block;
……
st_win_fun_key *Key;
st_win_fun_drv *Drv;
st_win_fun_lin_study *LinStudy;
……
} st_win;
添加成員函數,由於C語言中並不能在結構體中定義函數,但是我們卻可以在其中定義函數指針。這樣我們的結構體里,就有了成員函數。通過這種方式,實際上我們就完成了由結構體到類的轉變。
st_win_fun_key *Key;
st_win_fun_drv *Drv;
st_win_fun_lin_study *LinStudy;
解釋一下這裡添加的三個函數的含義:
st_win_fun_key:檢測車窗控制按鍵狀態的調用函數;
st_win_fun_drv:檢測車窗驅動狀態的調用函數;
st_win_fun_lin_study :車窗通過LIN匯流排學習位置的功能函數;
以上就完成了整個車窗類的定義,最後我們再通過它來定義各個車窗對象。
定義車窗對象
根據定義的車窗類,可以很方便的定義車窗對象。
比如定義一個左前車窗(駕駛側),
st_win DDWin;
左前車窗初始化,
DDWin =
{
{0},{0},{0},{0},{0},{0},
&WinKeyFun,
&WinDrvFun,
&WinLinStudyFun,
};
其他各個車窗以此類推,這完成整個車窗類和對象的設計。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/273320.html