gpt4 book ai didi

c - 使用 C 语言进行数据封装的 OOP 编程

转载 作者:行者123 更新时间:2023-11-30 15:05:57 25 4
gpt4 key购买 nike

我尝试根据这里的这篇文章用C语言进行数据封装https://alastairs-place.net/blog/2013/06/03/encapsulation-in-c/ .

在头文件中我有:

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

// Pre-declaration of struct. Contains data that is hidden
typedef struct person *Person;


void getName(Person obj);
void getBirthYear(Person obj);
void getAge(Person obj);
void printFields(const Person obj);

#endif

在“functions.c”中我定义了这样的结构

#include "Functions.h"

enum { SIZE = 60 };

struct person
{
char name[SIZE];
int birthYear;
int age;
};

另外我也定义了函数。

在 main.c 中我有:

#include "Functions.h"
#include <stdlib.h>

int main(void)
{
// Works because *Person makes new a pointer
Person new = malloc(sizeof new);

getName(new);
getAge(new);
getBirthYear(new);
printFields(new);

free(new);

return 0;
}

当我使用 Person new 时,这是真的吗? , new已经是指针,因为 typedef struct person *Person; .

链接器怎么可能看不到我在 struct person 中声明的主体和成员?

这只能使用指针吗?

在我的例子中,实现 OOP 原则以做出不同的 struct 是正确的(也是唯一的)方法吗?在functions.h像这样:

typedef struct classPerson
{ // This data should be hidden
Person data;

void (*fPtrGetName)(Person obj);
void (*fPtrBirthYear)(Person obj);
void (*fPtrGetAge)(Person obj);
void (*fPtrPrintFields)(const Person obj);
} ClassPerson;

最佳答案

首先,通常最好不要将指针隐藏在 typedef 后面,而是让调用者使用指针类型。这可以防止阅读和维护代码时出现各种误解。例如,如果您没有意识到 Person 是指针类型,则 void printFields(const Person obj); 看起来就像是无意义的。

Have I understood correctly, that when I use Person new, new is already pointer because of typedef struct person *Person;.

是的。您会因为提到的 typedef 而感到困惑。

How is it possible, that linker cannot see the body and members that I have declared in my ´struct person´?

链接器可以看到链接的所有内容,否则您最终不会得到有效的可执行文件。

但是,编译器适用于“翻译单元”(大致指 .c 文件及其所有包含的 header )。当编译调用者的翻译单元时,编译器看不到functions.c,它只看到functions.h。在functions.h 中,结构体声明给出了一个不完整类型。意思是“这个结构定义在其他地方”。

Is this only possible using pointer?

是的,如果您想在 C 中进行正确的 OO 编程,这是唯一的方法。这个概念有时称为不透明指针不透明类型

(尽管您也可以通过 static 关键字实现“穷人的私有(private)封装”。通常不推荐这样做,因为它不是线程安全的。)

Is the correct (and only) way to implement OOP prinicples in my case to make a different struct in functions.h like so:

差不多,是的(除了对提到的指针 typedef 的挑剔之外)。不过,使用指向公共(public)函数的函数指针并不是必需的,尽管这是实现多态性的方式。

您的示例缺少的是“构造函数”和“析构函数”。没有它们,代码就没有意义。 malloc 和 free 调用应该在其中,而不是由调用者完成。

关于c - 使用 C 语言进行数据封装的 OOP 编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39472797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com