c - 在 C 中实现构造函数的正确方法
问题描述
我想使用 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);
}
我认为 usingline1.add_line(&line1,
有点多余 - 因为很明显我想在 line1 上进行操作。有没有办法在不将指针传递给“对象”(结构)的情况下实现这一点?还是我没有想到的其他方式?
解决方案
仅仅为了模拟类似 C++ 的语法而使用函数指针只是很麻烦,没有明显的好处。无论您做什么,都不会在 C 中使用 RAII,因此您需要显式调用构造函数/析构函数。如果你是通过打字来做到这一点的,obj.foo()
或者obj = foo()
与 OO 完全无关,那只是编码风格。
不过,这里的主要问题是您的代码没有正确的 OO 设计,因为该结构是完全开放的并且没有使用私有封装。出于同样的原因,class line { public: int x; int y; };
也不是正确的 OO - 您不会仅仅因为将一些相关变量粉碎成聚合类型而获得 OO,而不管语言如何。
“最干净”/“最漂亮”意味着完全私有封装。在 C 中,这可以通过不透明类型来实现。我更喜欢在不隐藏 typedef 后面的指针的情况下实现它们,所以:
线.h
#include <stdio.h>
#include <stdlib.h>
typedef struct line line; // forward declaration of incomplete type
line* line_construct (int x, int y);
线.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;
}
调用者.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); return NULL; }
或者。
推荐阅读
- python - R 或 Python 中的分层数据列表数据整理
- c# - Unity 在应用程序关闭时赚取金币
- mysql - 选择内部连接给出不正确的结果
- android - 没有服务的后台应用程序
- typescript - 元组中的错误类型干扰(rest 和 spread 表达式)
- java - 并行化 Java 8 Stream.filter()?
- php - 如何在 PHP 中将 JSON-LD 转换为 JSON
- java - android 应用程序可以运行 gradle 吗?如何?
- javascript - JavaScript 中“+”和“,”的区别
- apache-spark - 使用 sparklyr 连接到纱线管理的火花集群后,本地计算机上的破坏性 Java 进程