1. 程式人生 > >C語言實現偽面向對象

C語言實現偽面向對象

一個 語言 私有變量 UNC bsp alloc vat 私有 eat

【1】每一個C文件都是一個偽類,除了main()函數所在的C文件。

【2】在C文件頂部定義該偽類的結構體,結構體內其實並沒有必要使用函數指針來模擬成員函數。

struct fifo_t
{
    uint8_t        *buf;
    uint32_t    size;
    uint32_t    in;
    uint32_t    out;
};

【3】NEW。

通過類似的函數來創建新的偽類對象/實例。銷毀類似。

struct fifo_t * fifo_create(uint32_t size)
{
    struct fifo_t * fifo = malloc
(sizeof(struct fifo_t)); /*
    
do something */ return fifo; }

【4】私有函數前加static關鍵字

static void * __fifo_a_private_func(struct fifo_t *fifo,int arg)

【5】頭文件中只包含結構體聲明和函數的聲明,保護結構體內的【私有變量】不被直接讀寫。

struct fifo_t;
struct fifo_t * fifo_create(uint32_t size);
void fifo_destroy(struct fifo_t *fifo);
/* some other functions */

【6】沒有繼承。
  一般也不需要繼承,實在需要就換C++好了。

【7】只有一個對象/實例的情況。其實這種情況才比較常見,可以放棄*_create()和*_destroy()函數,頭文件中也只需要函數聲明,這樣更徹底地保護私有變量。整個C文件中只有一個有static前綴的結構體實例,函數中也很明顯的區分出函數內部的局部變量和本文件的全局變量(對象)。

struct transmit_t
{
     int        fd;
    /*
    */
};
static struct transmit_t transmit =
{
    .fd 
= -1 }; int transmit_init() { transmit.fd = // some thing /* */ } void transmit_destroy() { /* */ }
/*
  some function
*

C語言實現偽面向對象