gpt4 book ai didi

c - C 中的实例级抽象

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:14 25 4
gpt4 key购买 nike

我不是 C 专家。自从我在大学学习 CS1 和 2 天以来,我没有做过任何 C。我在这里和那里做了一些 C++,但已经有一段时间了。所以我要问的是解决我所感知的问题的正确模式

我决定接受一个相当雄心勃勃的挑战,我正在用 C 语言来完成它。我正在(重新)学习的一件事是 C 语言中的不同抽象技术与我在更高级别中习惯的抽象技术语言。我遇到和询问的问题特别与测试和功能有关。

例如,我有两个函数 fg,如果某些条件满足,f 将调用 g是的。

void f(object* obj) {
// ...
if(obj->state)
g(obj);
// ...
}

我需要验证 g 是否确实被调用,但我也不想实际执行它,因为它可以做各种其他事情。这通常会通过接口(interface)或抽象类或继承的方式在更高级别的语言中解决。但是在 C 中我没有这些技术。

事实上,我能想到的解决这个问题的唯一办法就是利用函数指针。我认为我应该添加一个指向 object 的指针,而不是直接调用 g,这样它就有一个指向 g 的指针,我可以用一个指向测试中不同函数的指针。

typedef struct object {
int state;
void (*g)(object* obj);
} object;

void f(object* obj) {
// ...
if(obj->state)
obj->g(obj);
// ...
}

通常我在分配 g 的实例时只指向 g 但在我的测试中我将 obj->g 指向一个不同的函数,一个仅仅验证传入值并注意它实际上被调用了。

这是我现在的想法,但我不确定它是否是解决此问题的完全正确的 C-ish 方法。希望我的描述能说明我遇到的问题,但我真正想知道的是如何最好地处理它。

用 C 语言解决这个问题的推荐设计模式是什么?

最佳答案

如果你想改变 f 的不同调用中调用的函数 g,也许你应该将 g 作为参数传递给 f:

typedef void (*gFunc)(object* obj);

void f(object *obj, gFunc g) {
...
if (obj->state) {
g(obj);
}
...
}

如果你不想弄乱f的函数签名,你可以定义一个版本的f来调用上面的实现:

void gNormal(object* obj);           //normal implementation of g
void gTest(object* obj); //test version of g

void fGeneral(object* obj, gFunc g); //general implementation of f as above

void fNormal(object* obj)
{
fGeneral(obj, &gNormal); //use the default version of g
}

无论您选择此方法还是使函数指针 g 成为对象的成员,从语言的角度来看可能大致相同 - 您需要考虑什么对您的对象更有意义结构。

话又说回来,如果你正在做很多这样的事情,也许你应该使用面向对象的语言!

关于c - C 中的实例级抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12030261/

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