2011-08-29 76 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); 
} 

此外,对于一个后端的不同功能应该被塞进一个结构和应创建这样结构而不是每个包装函数一个阵列的阵列。