如何模仿Java/C++;在C中?

如何模仿Java/C++;在C中?,c,pointers,C,Pointers,这就是我想做的: 1) 我想要一个实例化数据结构的函数 void instantiateCDB(void); 2) 我还需要一个函数来更新实例化的数据结构,并返回指向该数据结构的常量指针(使其成为只读) 我知道这可以用C++/Java实现。但是它也可以用C语言实现吗 我想写的程序流程是: main(){ instantiateCDB(); // Allocates a CDB const struct canDataBlock * cdb = getUpdateSystem

这就是我想做的:

1) 我想要一个实例化数据结构的函数

void instantiateCDB(void);
2) 我还需要一个函数来更新实例化的数据结构,并返回指向该数据结构的常量指针(使其成为只读)

我知道这可以用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;
 }

问题是:如果数据结构将被声明为无效,那么如何通过
实例化ECDB
函数中实例化的写/读访问访问该数据结构?如果我要返回分配的数据结构,用户可以更改
canDataBlock
,从而失去其完整性。我想做的是,只有
getUpdateSystem()
可以更改
instanceECDB()
函数实例化的数据结构的值。我如何解决这个问题?在C语言中还有其他我不知道的技术吗。如果有,请教我。:)

有一种模式叫做
不透明数据指针
,它可能对您有所帮助。请参阅。

有一个名为
不透明数据指针的模式,它可能对您有所帮助。请参阅。

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

struct myclass_privdata;
struct myclass { int data; /* public member */ 
struct myclass_privdata* data_priv; /* private simulation*/ }
也可以使用函数指针模拟成员函数,但仍然需要显式传递对象引用(并对其进行初始化)

也许你能从中找到灵感。甚至还有关于这个话题的讨论

然而,对于这个话题,最好的建议是保持语言风格,而不是试图做一些不应该使用语言的事情(例如,在C中实现oop通常会导致样板代码增加较低的功能价值——这会使代码看起来像是用oop编写的,而实际上并非如此,并且对于那些以“本机”风格编程的人来说,代码看起来很难看)

回答你的问题

1) 返回数据实例的函数通常实现为返回malloced()指针的函数

#包括
结构S{int i;};
结构S*S_alloc(void){return malloc(sizeof(S));}
返回指向静态数据指针的代码几乎肯定是个麻烦,因为所有引用都将引用同一个对象。由ECDB(无效)判断;声明我怀疑它真的做了你想做的事


2) 我怀疑您是否真的“想要一个更新实例化的数据结构并返回指向该数据结构的常量指针(使其成为只读)”的函数,因为调用方仍将有一个刚刚传递给该函数的非常量指针。

C中的OO可以部分模拟(单词“simulation”而不是例如,可以通过将基结构嵌套为“派生”结构的第一个成员来模拟继承,在这种情况下,可以将派生指针结构“上溯”到“基”结构,就像在C中一样,可以保证指向结构的指针可以用于访问指向第一个成员的指针。 根据上下文,您可以使用不透明数据类型隐藏实现详细信息。若要模拟私有和公共数据,您可以提供完整的结构声明,包括所有成员,但仍可以将某些成员作为不透明或无效指针隐藏

struct myclass_privdata;
struct myclass { int data; /* public member */ 
struct myclass_privdata* data_priv; /* private simulation*/ }
也可以使用函数指针模拟成员函数,但仍然需要显式传递对象引用(并对其进行初始化)

也许你能从中找到灵感。而且,关于这个话题,甚至还有一个很好的答案

然而,对于这个话题,最好的建议是保持语言风格,而不是试图做一些不应该使用语言的事情(例如,在C中实现oop通常会导致样板代码增加较低的功能价值——这会使代码看起来像是用oop编写的,而实际上并非如此,并且对于那些以“本机”风格编程的人来说,代码看起来很难看)

回答你的问题

1) 返回数据实例的函数通常实现为返回malloced()指针的函数

#包括
结构S{int i;};
结构S*S_alloc(void){return malloc(sizeof(S));}
您返回指向静态数据的指针的代码几乎肯定是个麻烦,因为所有引用都将引用同一个对象


2) 我怀疑您是否真的“想要一个更新实例化的数据结构并返回指向该数据结构的常量指针(使其成为只读)”的函数,因为调用方仍然会有一个刚刚传递给该函数的非常量指针。

通常您会使用函数指针来完成此操作-。您的“类”(结构)将有一个函数指针数组,每种类型指向不同的函数。删除
[java]
[c++]< O/COD>因为答案与那些没有任何关系。使用OO的最好方法是使用C++。如果你使用的话,我不知道问题在哪里。如果不是,这里是你的。@ PeTraveRy不幸的是,我把它编程到一个微控制器,所以我被C.@ RADAI所困扰。你能解释得更清楚吗?)我只是一个初学者指针和函数指针。知道如何生成回调函数。通常你会使用函数指针-。你的“类”(结构)将有一个函数点数组
#include <stdlib.h>
struct S {int i; };
struct S* S_alloc(void) { return malloc(sizeof(S)); }