成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C和指針的示例分析

這篇文章將為大家詳細(xì)講解有關(guān)C和指針的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名注冊雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、新洲網(wǎng)站維護、網(wǎng)站推廣。

本文中的例子有這樣兩個概念:任務(wù)(Task),執(zhí)行器(Executor)。任務(wù)有名稱(taskName),并且可以執(zhí)行(execute)。 而執(zhí)行器與具體任務(wù)所執(zhí)行的內(nèi)容無關(guān),只是回調(diào)(callback)任務(wù)的執(zhí)行方法,這樣我們的執(zhí)行器就可以做的比較通用。而任務(wù)接口只需要實現(xiàn)一個execute方法即可,這樣我們的任務(wù)就可以是多種多樣的,可以通過統(tǒng)一的接口set給執(zhí)行器執(zhí)行。這是面向?qū)ο笾谢镜乃枷?,也是比較常用的抽象方式。下面我們具體看下例子。

可以想象,main函數(shù)大概是這個樣子:

int main(int argc, char** argv) {
Task *t1 = TaskConstruction("Task1", run);//此處的run是一個函數(shù)指針
Executor *exe = ExecutorConstruction();
exe->setTask(t1);
exe->begin();
exe->cancel();
Task *t2 = TaskConstruction("Task2", run2);//此處的run2也是一個函數(shù)指針,用于構(gòu)造一個Task.
exe->setTask(t2);
exe->begin();
exe->cancel();
return (EXIT_SUCCESS);
}

運行結(jié)果為:

task : [Task1] is ready to run
[a = 1.200000, b = 2.300000]
[(a + b) * (a - b) = -3.850000]
cancel is invoked here
task : [Task2] is ready to run
another type of execute,just print out some information
cancel is invoked here

好了,下面詳細(xì)看看實現(xiàn):

定義接口

首先,定義Task和Executor兩個實體的接口:

Task接口,注意其中的_this字段,這個指針在后邊有很重要的作用,用于hold整個Task的實例。然后是一個taskName的字符串,和一個函數(shù)指針,這個指針在初始化(構(gòu)造)Task時傳入。這個execute()函數(shù)比較有意思,它不在內(nèi)部使用,而是讓執(zhí)行器回調(diào)執(zhí)行的。

#ifndef _ITASK_H
#define    _ITASK_H
typedef struct Task{
struct Task *_this;
char *taskName;
void (*execute)();
}Task;
void execute();
#endif    /* _ITASK_H */

執(zhí)行器接口比Task接口復(fù)雜一些,其中包含_this指針,包含一個對Task的引用,然后是對外的接口begin(), cancel().對接口的使用者來說,他們只需要調(diào)用接口實例上的setTask(),將任務(wù)傳遞給執(zhí)行器,然后在適當(dāng)時期調(diào)用begin(),等待任務(wù)正常結(jié)束或者調(diào)用cancel()將其取消掉。

#include "ITask.h"
#ifndef _IEXECUTOR_H
#define    _IEXECUTOR_H
typedef struct Executor{
struct Executor *_this;
Task *task;
char *(*setTask)(Task* task);
void (*begin)();
void (*cancel)();
}Executor;
char *setTask(Task *task);
void begin();
void cancel();

#endif /* _IEXECUTOR_H */

實現(xiàn)接口

#include

執(zhí)行器的實現(xiàn)一樣,稍微復(fù)雜一點,構(gòu)造的時候,將函數(shù)指針在內(nèi)部設(shè)置好,當(dāng)外部調(diào)用時動態(tài)的執(zhí)行需要執(zhí)行的函數(shù),這句話可能有些繞口,這么看:在構(gòu)造Executor的時候,executor->begin = begin; 這條語句是將下面void begin()的實現(xiàn)注冊到結(jié)構(gòu)體中,但是要執(zhí)行什么還是不確切的,當(dāng)setTask以后,回調(diào)函數(shù)的地址已經(jīng)明確:

(executor->_this->task = task;),此時調(diào)用begin()即可正確的調(diào)用到注冊的Task上。
#include

其實,兩個實現(xiàn)的代碼都不算復(fù)雜,如果對C的指針理解的稍好,基本就沒什么問題了。

在C中使用OO

為了試驗,我們不妨設(shè)計兩個不同的Task,一個Task是計算兩個數(shù)的某四則混合運算,另一個僅僅是用來打印一點信息。然后我們可以看到,他們使用完全相同的接口來執(zhí)行:

#include

然后,在Main中獎他們注冊給Task,代碼如下所示:

#include

關(guān)于“C和指針的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

文章名稱:C和指針的示例分析
文章分享:http://jinyejixie.com/article40/gggieo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)靜態(tài)網(wǎng)站、手機網(wǎng)站建設(shè)網(wǎng)站營銷、網(wǎng)站內(nèi)鏈云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
香港 | 辽阳县| 新密市| 广安市| 胶南市| 肥乡县| 靖宇县| 临颍县| 洛宁县| 沈丘县| 洛宁县| 黄山市| 农安县| 垣曲县| 子洲县| 湄潭县| 商城县| 双辽市| 潼关县| 余江县| 河间市| 西林县| 江都市| 镇远县| 万载县| 万源市| 辛集市| 宜丰县| 察雅县| 武邑县| 太谷县| 乐安县| 汕头市| 拉萨市| 昌平区| 南平市| 铅山县| 郴州市| 沾化县| 遵义市| 晋宁县|