是否有任何解决方法使结构成员在C中以某种方式“私有”?

时间:2010-03-26 10:19:11

标签: c encapsulation

我正在用C开发一个简单的库,供我自己+一些朋友个人使用。

我目前有一个C结构,其中一些成员应该以某种方式隐藏在应用程序的其余部分,因为它们的使用只是内部的。偶然修改其中一个成员可能会使图书馆“疯狂”。

是否有任何“解决方法”隐藏这些成员以使其无法访问?

4 个答案:

答案 0 :(得分:15)

通常的技术是:

/* foo.h */
typedef struct Foo Foo;

Foo *foo_create(...);

void foo_bark(Foo* foo, double loudness);

/* foo.c */
struct Foo {
  int private_var;
};

您可以通过在标题中定义Foo并在.c文件中定义FooPrivate来部分隐藏数据成员:

struct FooPrivate {
  Foo public_stuff;
  int private_var;
}

但是你的实现必须在Foo和FooPrivate之间来回转换,我觉得这是一个皇家PITA,如果你以后改变主意并希望私有化,那将是一个维护负担。除非你想从代码中抽出每个最后一个CPU周期,否则只需使用访问器函数。

答案 1 :(得分:2)

马塞洛·坎托斯已经给你答案了。有关更多详细信息,您应该了解如何在大多数uderlying库中有效隐藏FILE结构。

您会注意到FILE结构本身永远不会对用户可用,只有接口和Opaque FILE *可供我们使用。

答案 2 :(得分:1)

基本上,我们的想法是用类似哈希的方式重命名结构的变量 并编写函数(可以在OO语言中使用各种模仿方法)来访问它们。 理想情况下,你应该在结构中有这些函数的函数指针,所以你不需要 必须调用外部函数并传递给你想要添加的成员。 但是,不知道函数指针语法是最漂亮的。 一个简单的例子可以澄清Marcelo之前的说法:

struct Car {
    int _size;
    char _colour[10];

};

typedef struct Car Car;


int main (int argc, char **argv) {   
    Car *myCar= malloc(sizeof(Car));
    myCar->_size=5; /* accessing it directly just to set up a value, you shold have an
                       accessor function really */

    printf("car size is: %i \n",getCarSize(myCar));
    free(myCar);
}




int getCarSize(Car *myCar) {
     return myCar->_size;
}

答案 3 :(得分:1)

我同意Marcelo Cantos,但也建议在“公共”结构中添加一个指针,指向“私人”内容,即:

/* foo.h */
typedef struct Bar Bar;
typedef struct Foo 
{
   int public;
   Bar* private;
} Foo;

Foo *foo_create(...);

void foo_bark(Foo* foo, double loudness);

/* foo.c */
struct Bar 
{
  int private_var;
};

这种方法有点像“pimpl”的意思。迄今为止最简单的方法是做Marcelo Cantos所建议的。