91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C和指針的示例分析

發布時間:2021-12-18 15:02:04 來源:億速云 閱讀:145 作者:小新 欄目:編程語言

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

本文中的例子有這樣兩個概念:任務(Task),執行器(Executor)。任務有名稱(taskName),并且可以執行(execute)。 而執行器與具體任務所執行的內容無關,只是回調(callback)任務的執行方法,這樣我們的執行器就可以做的比較通用。而任務接口只需要實現一個execute方法即可,這樣我們的任務就可以是多種多樣的,可以通過統一的接口set給執行器執行。這是面向對象中基本的思想,也是比較常用的抽象方式。下面我們具體看下例子。

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


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


運行結果為:


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


好了,下面詳細看看實現:

定義接口

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

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

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

執行器接口比Task接口復雜一些,其中包含_this指針,包含一個對Task的引用,然后是對外的接口begin(), cancel().對接口的使用者來說,他們只需要調用接口實例上的setTask(),將任務傳遞給執行器,然后在適當時期調用begin(),等待任務正常結束或者調用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 */

實現接口

#include

執行器的實現一樣,稍微復雜一點,構造的時候,將函數指針在內部設置好,當外部調用時動態的執行需要執行的函數,這句話可能有些繞口,這么看:在構造Executor的時候,executor->begin = begin; 這條語句是將下面void begin()的實現注冊到結構體中,但是要執行什么還是不確切的,當setTask以后,回調函數的地址已經明確:


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


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

在C中使用OO

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

#include

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

#include


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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

自贡市| 白朗县| 琼中| 万宁市| 巨鹿县| 汾西县| 达拉特旗| 商水县| 富阳市| 呼伦贝尔市| 安顺市| 黄梅县| 河北区| 尉氏县| 新闻| 绥棱县| 富源县| 辽阳市| 荣昌县| 朝阳县| 明溪县| 华坪县| 津南区| 罗城| 宜兰市| 上思县| 桑日县| 玛曲县| 赣州市| 页游| 东光县| 西和县| 临西县| 凭祥市| 泰和县| 深水埗区| 清水县| 尼勒克县| 富蕴县| 泰州市| 马边|