我想在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);

类似地,Points的数组是不受限制的;在其他Points中嵌入structs也不可能。
我想做C++做的事情吗?
不是真的。您的方法与Objto-C类似,因为C++没有限制仅在动态存储中分配对象的限制,而Objto-C则没有限制。不过,这种限制似乎不会给objective-c程序员带来太多问题。

10-08 01:00