gpt4 book ai didi

c - 在 C 中执行 OOP 时模拟 'this' 指针的优雅方法?

转载 作者:太空宇宙 更新时间:2023-11-04 00:19:04 25 4
gpt4 key购买 nike

我想使用多态性在 C 语言中进行一些面向对象风格的编程,其中我的接口(interface)类包含一个指向函数表的指针。例如:

/* Implement polymorphism in C, Linux kernel-style */
struct statement {
const struct statement_ops *ops;
struct list_head list; /* when on master input list */
void *private; /* pointer to type-specific data */
};

struct statement_ops {
int (*analyse)(void *private, int pc);
int (*get_binary_size)(void *private);
};

void user(void)
{
struct statement *s = make_a_statement();
if (s->ops->analyse(s->private, foo))
blah blah;
}

我希望能够在不显式地将 s->private 传递给每个“方法”的情况下编写一些东西。有任何想法吗?可能有一些宏观技巧?

最佳答案

如果这是公共(public)接口(interface)的一部分,您可以添加访问器函数。一个隐藏的好处是您可以在访问器中进行健全性检查和其他工作。 (请注意,我将“this”指针称为“o”,就像在“object”中一样。为了保持一致性,我更喜欢这种方式。)

int statement_analyse (struct statement *o, int pc)
{
assert(pc >= 0);

int ret = o->ops->analyse(o->private, pc);
assert(ret >= 0);

return ret;
}

您现在可以在不显式传递“private”的情况下调用它。

void user(void)
{
struct statement *s = make_a_statement();

if (statement_analyse(s, foo))
blah blah;
}

虽然这似乎没有任何好处,因为您仍然必须实现访问器,假设您想要一个定义良好且健壮的接口(interface),访问器函数是放置断言和接口(interface)文档的唯一明智的地方。事实上,如果您编写好的断言,断言本身有助于记录接口(interface)。一旦您在访问器中添加完整性检查,就不必将它们添加到它们调用的实际方法中。

当然,只有当通过函数指针调用的函数是由用户提供的,或者以其他方式可以是不同的东西时,这种方法才有意义。如果只有一个 analyse() 方法总是做同样的事情,您可以简单地实现一个 statement_analyse() 直接做它需要做的事情。

小提示:在进行 OOP 时,我更喜欢对结构进行 typedef 并给它们命名为 CamelCase。我使用此约定作为一种方式来说明该结构是不透明的,并且只能通过其公共(public)接口(interface)访问。它看起来也更好,尽管这是主观的。我也更喜欢让用户为结构本身分配内存,而不是构造函数分配它。这避免了必须处理 malloc 失败,并使程序更高效。

typedef struct {
...
} Statement;

void Statement_Init (Statement *o);
int Statement_Analyse (Statement *o, int pc);

关于c - 在 C 中执行 OOP 时模拟 'this' 指针的优雅方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10266559/

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