我想在c中创建一个结构,它的数据不能被任何人直接访问,就像在面向对象中那样,通过get和set。我的解决办法是:
H点
#ifndef POINT_H
#define POINT_H
typedef struct point Point;
Point *CreatePoint(int x, int y);
int Point_GetX(Point *point);
void Point_SetX(Point *point, int x);
int Point_GetY(Point *point);
void Point_SetY(Point *point, int y);
void DeletePoint(Point **p);
#endif /* POINT_H */
C点
#include "Point.h"
struct point{
int x, y;
};
Point *CreatePoint(int x, int y){
Point *p = malloc(sizeof(Point));
if (p == NULL) return NULL;
p->x = x;
p->y = y;
return p;
}
int Point_GetX(Point *point){
return point->x;
}
void Point_SetX(Point *point, int x){
point->x = x;
}
int Point_GetY(Point *point){
return point->y;
}
void Point_SetY(Point *point, int y){
point->y = y;
}
void DeletePoint(Point **p){
if (*p != NULL){
free(*p);
*p = NULL;
}
}
主C
#include <stdio.h>
#include <stdlib.h>
#include "Point.h"
int main(){
Point *p = CreatePoint(2, 6);
if (p == NULL) return EXIT_FAILURE;
/*
p->x = 4; "error: dereferencing pointer
p->y = 9; to incomplete type"
*/
Point_SetX(p, 4);
Point_SetY(p, 9);
printf("POINT(%d,%d)", Point_GetX(p), Point_GetY(p));
DeletePoint(&p);
return EXIT_SUCCESS;
}
当然,我决不会把这一切都简单化,但这就是我的想法。我想知道这样做会出什么问题,我是否应该这样做,如果可以这样做,如果这不是一个聪明的方法(我应该只使用c++xd)。
原因是我正在做一个小项目,但我可能会在以后更改一些数据结构和算法,所以如果我这样做,我只需要更改点。在这种情况下,不是每个地方我都会这样做
point->x = new_x
例如。
基本上,我是在试着做C++所做的事情吗?或者用C语言做这个可以吗?还是没有,这是一个劣势?或者这根本不是C的本意?哈哈
最佳答案
我的解决办法是这样的
这是c语言中信息隐藏的经典解决方案。唯一缺少的是DestroyPoint
,这是一个函数,用于释放用malloc
分配的点结构。
我想知道这样做会出什么问题,我是否应该这样做,如果可以这样做。
这是一种安全的方法,只要你对它的缺点没有问题,下面将对其进行描述。
[有没有]缺点?
是的,有:这种方法仅限于对数据结构的动态分配,而数据结构的内部是隐藏的。你不能这样做:
Point p; // This fails, because `Point` is a forward declaration.
int x = Point_GetX(&p);
类似地,
Point
s的数组是不受限制的;在其他Point
s中嵌入struct
s也不可能。我想做C++做的事情吗?
不是真的。您的方法与Objto-C类似,因为C++没有限制仅在动态存储中分配对象的限制,而Objto-C则没有限制。不过,这种限制似乎不会给objective-c程序员带来太多问题。