在 中 如果考慮要將在棧中儲存的值限定在一定範圍內應該怎麼辦呢?例如只允許0到9內的值push至棧中,該範圍以外的值或是空值則不能被push至棧中。
如果重新再編寫乙個方法進行
bool pushwithrangechenk(stack *p,int val ,int min,int max)
stack;
#define newstackwithrangecheck(buf,min,max)
static bool israngeok(const stack *p,int val)
bool push(stack *p, int val)
p->pbuf[p->top++] = val;
return true;
}
上面**結構體裡 儲存了是否需要進行範圍檢查(needrangecheck)的資訊以及值的有效範圍(min,max),並且定義了新的巨集,用來生成帶有範圍檢查功能的棧。
int buf[10];
stack stack = newstackwithrangecheck(buf, 0, 9);
注意:
如果只有這樣簡單的功能,上述方法足夠應付了,但是以上**中仍然有以下問題。
因為結構體成員 needrangecheck、min、max 值在israngeok函式中被使用,將它們作為結構體成員讓所有函式都可以看到是不合適的,也就是說存在作用域汙染問題,所以需要把這些成員分離出去:
typedef structrange;
typedef struct stack;
#define newstackwithrangecheck(buf,prange)
將範圍檢查分離出來的棧:
static bool israngeok(const range * p,int val)
bool push(stack *p, int val)
p->pbuf[p->top++] = val;
return true;
}
檢查功能的通用化
之前對棧加入了輸入值上限和下限的檢查功能,一般情況下,檢查並不限於範圍檢查,例如,如果要求每次push到棧中的值都必須比上次的值大(雖然一般不會有這種要求),目前的**還無法滿足要求,但是只要將輸入值檢查變得更通用化就能解決這個問題
首先:將檢查輸入值的通用職責轉移到結構體中:
#ifdef __cplusplus
extern "c"validator;
typedef structrange;
typedef structpreviousvalue;
typedef struct stack;
//5
bool validaterange(validator * pthis,int val);
bool validateprevious(validator * pthis,int val);
bool push(stack *p, int val);
bool pop(stack *p,int *pret);
//6#define rangevalidator(prange)
#define previousvalidator(pprevious)
#define newstack(buf)
#define newstackwithrangecheck(buf,prange)
#define newstackwithvalidator(buf,pvalidator)
#ifdef __cplusplus
}#endif
1.validator 結構體中的第乙個成員是函式指標。該函式的引數為指向validator結構體的指標和需要校驗的值,並以bool型別返回校驗結果。
2.第二個成員為校驗是所需要的資料。由於校驗型別不同,所以需要被校驗的型別也不盡相同,為了能夠儲存任意型別資料,這裡使用了void指標。
3.如果是範圍檢查,則2中的void指標接受的資料為range結構體。
4.如果是push值遞增的校驗 則2中的void指標接受的資料為儲存上次push的值的結構體。
5.函式指標所指向的校驗函式,validator的pdata成員是void指標,因此先通過型別轉換取出校驗時所必須的值,然後進行校驗處理。
6.使得結構體的生成變得更加簡單的巨集。
c 物件導向程式設計 物件導向
什麼是物件導向 是對現實世界理解和抽象的方法。物件導向程式設計的特點 易維護,易擴充套件,靈活性好,重用 類 對事物的抽象定義,即事物具有的共同特徵和行為。物件 即對類進行例項 類是抽象的,物件是具體的 類的定義 語法 訪問修飾符 class 類名類的成員 包括字段,屬性,方法,常量,事件和索引器等...
JS物件導向使用物件導向進行開發
對 js 中的物件導向的基礎進行講述,初體驗使用物件導向進行開發 物件導向的概念及特性 用物件導向的方式解決簡單的標籤建立例項 物件導向就是使用物件 物件導向開發就是使用物件開發 面向過程就是以過程的方式開發 物件導向是面向過程的封裝 抽象性如果需要用一物件來描述乙個資料,那就需要抽取這個物件的核心...
C 物件導向程式設計
1.1 類與物件 物件 object 是類 class 的乙個例項 instance 如果將物件比作房子,那麼類就是房子的設計圖紙。所以物件導向程式設計的重點是類的設計,而不是物件的設計。類可以將資料和函式封裝在一起,其中函式表示了類的行為 或稱服務 類提供關鍵字public protected 和...