c结构中的私有成员

时间:2016-05-24 21:54:13

标签: c struct private

我读过许多线索 How to make struct members private? Hiding members in a C struct 但是我没有帮助我 我有一个头文件

#ifndef TEST_H_
#define TEST_H_
typedef struct point point;
#endif /* TEST_H_ */

和c档

#include "test.h"
struct point
{
    void *data;
};

当我试图在main.c中创建一个点结构实例

static point objpoint;
main()
{
}

编译器收到此错误 描述资源路径位置类型

237变量“objpoint”声明了一个永不完成的类型main.c

BTW,如果我定义了一个指向结构的指针,如

static point *ppoint;

编译器不会生成任何错误

另外,我需要避免对struct对象进行动态分配的一个更重要的信息

请告知。

2 个答案:

答案 0 :(得分:2)

您只能使用前向声明创建struct point类型的对象。

您需要添加函数来构造struct point的实例并操纵其数据。在这些函数中,只处理指针。

在.h文件中添加声明:

#ifndef TEST_H_
#define TEST_H_

typedef struct point point;

point* constructPoint();
void setX(point* p, int x);
void setY(point* p, int y);

int getX(point* p);
int getY(point* p);


#endif /* TEST_H_ */

定义{。1}}和.c文件中的函数:

struct

使用这些函数在main.c中构造和操作对象:

#include "test.h"
struct point
{
   int x;
   int y;
};

point* constructPoint()
{
   return calloc(1, sizeof(point));
}

void setX(point* p, int x)
{
   p->x = x;
}

void setY(point* p, int y)
{
   p->y = x;
}

int getX(point* p)
{
   return p->x;
}

int getY(point* p)
{
   return p->y;
}

答案 1 :(得分:0)

嗯,你已经回答了你的问题。如果您试图将结构成员隐藏在其他代码中,则必须使用指针。

问题是,当编译器遇到代码中的这一行时:

static point objpoint;

它需要知道为它分配多少空间,并且需要知道结构的数据成员是什么。因此,必须在代码中完全定义所有字段及其类型。

如果要隐藏结构的数据成员。您需要定义一个返回指向结构的指针的创建函数(如另一个答案中所述)。并且只在其他地方使用指向你的结构的指针。

您可以静态分配结构,但仅限于定义结构的文件。然后,您可以返回指向该变量的指针,而不是分配新的变量。但是你仍然需要在其他地方使用指针引用该结构。