c - 在 C 中实现构造函数的正确方法

标签 c oop struct constructor

我想用 C 创建一个构造函数。 实现这一目标的最简洁方法是什么?

我的尝试:

#include <stdio.h>

struct line {
    void (*add_line_ptr)(struct line*, int x, int y);
    int x;
    int y;
};

void add_line(struct line* lptr, int x, int y)
{
    lptr->x = x;
    lptr->y = y;
}


int main()
{
    struct line line1 = {add_line, 0, 0};
    line1.add_line_ptr(&line1, 10, 20);
    printf("%d %d\n", line1.x, line1.y);
}

我认为使用 line1.add_line(&line1, 有点多余 - 因为很明显我想在 line1 上进行操作。 有没有一种方法可以在不传递指向“对象”(结构)的指针的情况下实现这一点?还是我没有想到的其他方式?

最佳答案

仅仅为了模拟类 C++ 的语法而使用函数指针只会造成困惑,而且没有明显的好处。无论你做什么,你都不会在 C 中拥有 RAII,所以你需要明确地调用构造函数/析构函数。如果您通过键入 obj.foo()obj = foo() 来执行此操作,则与 OO 完全无关,这只是编码风格。

这里的主要问题是您的代码没有正确的 OO 设计,因为该结构是完全开放的并且没有使用私有(private)封装。出于与 class line { public: int x; 相同的原因诠释y; }; 也不是正确的 OO - 你不会因为将一些相关变量粉碎成聚合类型而获得 OO,而不管语言如何。

“最干净”/“最漂亮”意味着完全私有(private)封装。在 C 中,这可以通过不透明类型来实现。我更喜欢在不将指针隐藏在 typedef 后面的情况下实现它们,因此:

line.h

#include <stdio.h>
#include <stdlib.h>

typedef struct line line; // forward declaration of incomplete type

line* line_construct (int x, int y);

line.c

#include "line.h"

struct line {    // actual definition of the struct, local to line.c
    int x;       // private variable
    int y;       // private variable
};

line* line_construct (int x, int y)
{
  line* obj = malloc (sizeof *obj); 
  if(obj == NULL) { /* error handling here */ } 

  obj->x = x;
  obj->y = y;

  return obj;
}

caller.c

#include "line.h"

int main(void)
{
    line* x = line_construct(10, 20);
}

此处 line 被 100% 封装,调用者无法访问结构的内容。由于我没有在 typedef 后面隐藏指针,因此调用者必须始终使用 line* 指针并且永远不能直接声明对象的实例。

如果构造函数只是为了将结构成员清零,那么它不需要传递任何参数,但可以在内部传递。

显然你还需要用 free 实现相应的析构函数。
line* line_destruct(line* obj) { free(obj);返回空值; 左右。

关于c - 在 C 中实现构造函数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61366592/

相关文章:

Char 类型不接受输入

c - 如何将 K&R 函数声明自动转换为 ANSI 函数声明?

ios - 我什么时候使用自有属性(property)?

c++ - 如何在代码中读取嵌套结构?

c# - 使用 Mupen64Plus Unmanaged C dll API 命令填充 C# 结构

c - 如何在 C 脚本中分配从命令行传递的文件名?

恒定时间字符串相等性测试返回值

java - 如何将数据库中计数的属性添加到@Entity 类?

c - 通过 C 中的几个函数传递结构?

arrays - 如何调用或访问数组和结构组合中的特定值?