这就是我想要做的:
1)我想要一个实例化数据结构的函数。
void instantiateCDB(void);2)我还想要一个函数来更新实例化的数据结构,并返回指向数据结构的const指针(使它成为只读的)。
我知道这可以在C++/Java中完成。但也可以用C语言做吗?
我想要写的程序流是:
main(){
instantiateCDB(); // Allocates a CDB
const struct canDataBlock * cdb = getUpdateSystem();
}
// But the best function definitions that I can come up with is this.
struct canDataBlock * instantiateCDB() {
static struct canDataBlock cdb = {0};
return &cdb;
}
const struct canDataBlock * getUpdateSystem() {
struct canDataBlock * cdb = instantiateCDB();
return &cdb;
}问题是:如果在instantiateCDB函数中实例化了数据结构,那么如何访问它呢?如果我要返回分配的数据结构,用户可以更改canDataBlock,从而失去其完整性。我想要做的是,只有getUpdateSystem()可以更改由instantiateCDB()函数实例化的数据结构的值。我该如何解决这个问题?还有一种我不知道的C语言中的技术。如果有,请教我。:)
发布于 2013-10-06 09:14:58
可以部分模拟C中的OO (故意选择“模拟”而不是“实现”),例如,可以通过嵌套基结构作为“派生”结构的第一个成员来模拟继承,在这种情况下,可以将派生的指针结构“向上转换”到“基本”结构,就像C中保证指向结构的指针可以用来访问指向第一个成员的指针一样。根据上下文,可以使用不透明数据类型隐藏实现详细信息。要模拟私有和公共数据,可以提供完整的struct声明,包括所有成员,但仍可以将一些成员隐藏为不透明或无效的指针。
struct myclass_privdata;
struct myclass { int data; /* public member */
struct myclass_privdata* data_priv; /* private simulation*/ }您也可以使用函数指针来模拟成员函数,但是仍然需要显式传递对象引用(并对其进行初始化)。
struct S;
void do(struct S* this_p) { }
struct S { void (*do_smth)(struct s* this_p); } s;
s->do_smth = do;
s->do_smth(s);也许你可以在glib库对象模型中找到灵感。还有一个关于这个话题的书。
然而,对于这个主题,最好的建议是保持语言风格,而不是尝试去做不应该使用的语言(例如,在C中实现oop常常会导致样板代码,这会增加低的函数值--它使代码看起来像是用OOP编写的,而实际上它并不是用OOP编写的,而且对于那些使用“原生”风格编程的人来说,代码看起来很难看)。
回答你的问题。
1)返回数据实例的函数通常被实现为返回malloced()指针的函数
#include <stdlib.h>
struct S {int i; };
struct S* S_alloc(void) { return malloc(sizeof(S)); }返回指向静态数据的指针的代码几乎肯定是一个麻烦,因为所有引用都将引用同一个对象。从void instantiateCDB(Void)判断;声明,我怀疑它真的做了您想做的事情。
2)我怀疑您是否真的需要一个函数来更新实例化的数据结构,并返回指向数据结构的const指针(使其为只读)--因为调用方仍将有一个刚刚传递给该函数的非const指针。
发布于 2013-10-06 08:45:39
有一个叫做opaque data pointer的模式,它在这里可能对你有帮助。见类型。
https://stackoverflow.com/questions/19206870
复制相似问题