2011-08-29 114 views
0

我必須用C編寫代碼,用戶在選擇任何現有數據庫,寫入文件或實現其自己的存儲機制時必須具有靈活性。我需要包裝函數重定向到與在運行時或編譯時選擇的存儲機制相對應的正確函數。假設我的存儲選項是FLATFILE和SQLDB,並且我的包裝函數是insert(value)。因此,如果我選擇FLATFILE作爲存儲,當我調用包裝函數insert(value)時,它應該依次調用寫入文件的函數。如果我選擇一個SQLDB,插入(值)應調用插入數據庫中的值的函數。使用函數指針結構的C中的包裝函數

我知道我可以以某種方式使用函數指針的結構來包裝函數,但我不知道如何。

有誰知道任何文檔,鏈接,例子等我可以參考,理解和實施這樣的事情?任何指針將不勝感激。謝謝!

謝謝!

+7

是功課嗎? (通常的問題......) – jv42

+0

不作業,工作。此外,我並不真正要求這裏的代碼,只是指針和建議等:-) – cnovice

+0

這是你有什麼麻煩?定義一個函數指針?定義一個結構?從指針調用函數?如何組織這一切? – Kevin

回答

0

你可以使用一個簡單的版本,例如:

struct backend { 
    int (*insert)(...); 
    int (*remove)(...); 
    ... 
}; 

static struct backend db_backend = { db_insert, db_remove, ... }; 
static struct backend other_backend = { other_insert, other_remove, ... }; 

const struct backend *get_backend(enum backend_type type) 
{ 
    switch (type) 
    { 
    case DB_BACKEND: 
     return &db_backend; 
    case DB_OTHER: 
     return &db_other; 
    ... 
    } 
} 

上述所有可以隱藏一個C文件中,與get_backend和枚舉公職。然後你可以使用它像這樣:

struct backend *b = get_backend(DB_BACKEND); 
b->insert(...); 
b->remove(...); 

許多細節丟失,當然(很多人喜歡使用typedef,例如)。這是一個基本設置,如果您不喜歡b->insert(...)語法,或者想要設置後端一次,然後在代碼中使用insert()remove(),則還可以創建包裝函數。如果您已經有一些直接撥打insert()的代碼,並且您希望將呼叫轉到右後端,這也很有用。

如果您想要更詳細的解決方案,請查看http://www.cs.rit.edu/~ats/books/ooc.pdf。你不需要實現它的每一個細節,但它可以給你一些想法。

1
#define BACKEND_FLATFILE 0 
#define BACKEND_SQLDB 1 

void insert_flatfile(const t_value *v) { 
    ... 
} 

void insert_sqldb(const t_value *v) { 
    ... 
} 

void (*insert_functions[]) (const t_value *) = { 
    insert_flatfile, 
    insert_sqldb, 
}; 

void insert_wrapper(t_value *v, int backend) { 
    insert_functions[backend](v); 
} 

此外,對於一個後端的不同功能應該被塞進一個結構和應創建這樣結構而不是每個包裝函數一個陣列的陣列。