2013-10-06 38 views
0

这就是我想要做的:如何在C中模拟Java/C++的面向类的方法?

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中有另一种我不知道的技巧。如果有,请教我。 :)

+1

通常你会这样做与函数指针 - http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work。你的“类”(结构)将有一个函数指针数组,每个类型指向不同的函数。 – radai

+2

删除'[java]'和'[C++]'作为答案不会有任何关系。使用OO的最好方法是使用C++。 –

+2

你在使用[不透明指针](http://en.wikipedia.org/wiki/Opaque_pointer)吗?如果是的话,我不知道问题出在哪里。如果没有,这是你的[解决方案](http://stackoverflow.com/questions/7553750/what-is-an-opaque-pointer-in-c)。 – anatolyg

回答

2

C中的OO可以部分模拟(单词“模拟”而不是“实现”是故意选择的),例如,可以通过将基础结构嵌套为“派生”结构的第一个成员来模拟继承,在这种情况下可以将派生指针结构“向上”转换为“base”结构,如C中所示,可以保证指向结构的指针可以用于访问指向第一个成员的指针。 根据上下文,您可以使用不透明数据类型来隐藏实现细节。为了模拟私人和公共数据,您可以提供完整的结构声明,包括所有成员,但仍将一些成员隐藏为不透明或无效指针。

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); 

也许你可以在​​找到灵感。还有关于这个话题的book

但是,对于这个主题,现有最好的建议是保持语言风格,而不是试图去做那些语言不应该被使用的事情(例如,在C语言中实现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指针。

相关问题