0

这就是我想要做的:

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 中是否有另一种我不知道的技术。有的话请教我。:)

4

2 回答 2

2

有一种名为 的模式opaque data pointer,它可能对您有所帮助。请参阅http://en.wikipedia.org/wiki/Opaque_data_type

于 2013-10-06T08:45:39.150 回答
2

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

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 编写的,而实际上并非如此,并且使代码对于那些以“本机”风格编程的人来说看起来很丑)。

解决你的问题。

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

#include <stdlib.h>
struct S {int i; };
struct S* S_alloc(void) { return malloc(sizeof(S)); }

您返回指向静态数据的指针的代码几乎可以肯定是一个麻烦,因为所有引用都将引用同一个对象。并通过 void instantiateCDB(void); 判断 声明我怀疑它真的是你想做的。

2)我怀疑你真的“想要一个函数来更新实例化的数据结构并返回一个指向数据结构的 const 指针(使其成为只读)” - 因为调用者仍然有一个非常量指针刚刚传递给这样的函数。

于 2013-10-06T09:14:58.447 回答