C與物件導向

2021-09-26 04:05:49 字數 3765 閱讀 5845

1.實現

stack.h

#ifndef _stack_h_

#define _stack_h_

#include #ifdef __cplusplus

extern "c" stack;

bool push(stack *p, int val);

bool pop(stack *p, int *pret);

#define newstack(buf)

#define newstackwithrangecheck(buf, min, max)

#ifdef __cplusplus

}#endif

#endif

stack.c

#include #include "stack.h"

static bool isstackfull(const stack *p)

static bool isstackempty(const stack *p)

static bool israngeok(const stack *p, int val)

// true: 成功, false: 失敗

bool push(stack *p, int val)

// true: 成功, false: 失敗

bool pop(stack *p, int *pret)

使用:

int buf[16];

stack stack = newstackwithrangecheck(buf,0,9);

2.分析:

如果只是這樣簡單的功能,刪除方法足夠應對了。但是,上面的**中仍然存在如下問題:

那麼,這次增加的結構體成員needrangecheck、min、max真的有必要和結構體的其他成員放在相同的位置嗎? 這些成員只在israngeok函式中被使用,將他們作為結構體成員讓所有函式都可以看到是不合適的,也就是說存在作用域汙染問題。那麼我們需要把這些成員分離出去。

1.實現

stack.h

#ifndef _stack_h_

#define _stack_h_

#include #ifdef __cplusplus

extern "c" range;

typedef struct stack;

bool push(stack *p, int val);

bool pop(stack *p, int *pret);

#define newstack(buf)

#define newstackwithrangecheck(buf, prange)

#ifdef __cplusplus

}#endif

#endif

stack.c

#include #include "stack.h"

static bool isstackfull(const stack *p)

static bool isstackempty(const stack *p)

static bool israngeok(const range *p, int val)

// true: 成功, false: 失敗

bool push(stack *p, int val)

// true: 成功, false: 失敗

bool pop(stack *p, int *pret)

1.實現

stack.h

#ifndef _stack_h_

#define _stack_h_

#include #ifdef __cplusplus

extern "c" validator;

typedef struct range;

typedef struct previousvalue;

typedef struct stack;

bool validaterange(validator *pthis, int val);

bool validateprevious(validator *pthis, int val);

bool push(stack *p, int val);

bool pop(stack *p, int *pret);

#define newstack(buf)

#define rangevalidator(prange)

#define previousvalidator(pprevious)

#define newstackwithvalidator(buf, pvalidator)

#ifdef __cplusplus

}#endif

#endif

stack.c

#include #include "stack.h"

static bool isstackfull(const stack *p)

static bool isstackempty(const stack *p)

bool validaterange(validator *pthis, int val)

bool validateprevious(validator *pthis, int val)

bool validate(validator *p, int val)

// true: 成功, false: 失敗

bool push(stack *p, int val)

// true: 成功, false: 失敗

bool pop(stack *p, int *pret)

測試:

#include "gtest/gtest.h"

#include #include "stack.h"

test(stacktest, popfromemptystackreturnsfalse)

test(stacktest, popreturnsstacktopandremoveit)

test(stacktest, pushtofullstackreturnsfalse)

test(stacktest, pushwithrangecheck) ;

validator validator = rangevalidator(&range);

stack stack = newstackwithvalidator(buf, &validator);

expect_eq(false, push(&stack, -1));

expect_eq(false, push(&stack, 10));

}test(stacktest, pushwithpreviouscheck) ;

validator validator = previousvalidator(&previous);

stack stack = newstackwithvalidator(buf, &validator);

expect_eq(true, push(&stack, 3));

expect_eq(false, push(&stack, 2));

}int main(int argc, char **ar**)

C與C ,面向過程與物件導向

注 個人理解 對比區別 c語言程式制定具體流程,按流程逐步進行。c 程式將過程結構化,需要使用時利用介面訪問與呼叫不同功能的類結構結構。pragma once namespace myelevator int direction 方向 int now floor 當前樓層 int targer fl...

面向過程與物件導向 c語言與c

沒有深思熟慮的設計過程 使用時存在很多 灰色地帶 殘留了過多低階語言的特徵 直接利用指標進行記憶體操作 最終執行效率的高效 特點 分析解決問題所需要的步驟 利用函式實現各個步驟 一次呼叫函式解決問題 問題 軟體可重用性差 軟體可維護性差 構建的軟體無法滿足使用者需求 特點 直接分析使用者需求中涉及的...

C 物件導向 , 類與物件

一,類的字段 類的字段,就是類裡面的 資料。二,類的方法 1 函式的過載 如何判斷 是由兩個或多個同名函式組成的,但是函式要有不同的引數 或個數。引數 是函式的輸入的東西 shuchu shuchu inta shuchu int aaa string bbb 2,類的字段 俗點說就是類裡面定義的變...