C和指標

來源:互聯網
上載者:User

前言

指標是C的靈魂,正是指標使得C存在了這麼多年,而且將長期存在下去。事實上,我自己不用C語言寫程式已經有一年了,工作中接觸到的只有java,python和javascript。最近用C完成了一下類似於OO中的封裝(即"類")的概念,順便把指標複習了下,感覺有必要記一下。

本文中的例子有這樣兩個概念:任務(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 <stdlib.h>
#include "ITask.h"

Task *task = NULL;

void execute();

/*
 * The construction of Task object.
 * name : the name of the task
 * execute : execute method of the task
 * 
 */
Task *TaskConstruction(char *name, void (*execute)()){
    task = (Task*)malloc(sizeof(strlen(name))+sizeof(execute));
    task->taskName = name;
    task->execute = execute;
    task->_this = task;

    return (Task*)task;//返回一個自身的指標,通過內部的_this指標,兩者即可實現封裝
}

/*
 * Destruction of task, not used current time.
 *
 */
void TaskDestruction(){
    task->taskName = NULL;
    task->execute = NULL;
    task->_this = NULL;
    task = NULL;
}

/*
 * private method, should register to executor
 *
 */
void execute(){
    task->_this->execute();//調用_this上的execute()方法
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.