我不是 C 专家。自从我的 CS1 和大学 2 天以来,我没有做过任何 C。我在这里和那里做了一点 C++,但已经有一段时间了。所以我要问的是解决我正在感知的问题的正确模式。
我决定接受一个相当雄心勃勃的挑战,我正在用 C 来做。我正在(重新)学习的一件事是 C 中的不同抽象技术与我习惯于使用高级语言的抽象技术。我遇到并询问的问题特别与测试和功能有关。
例如,我有两个函数f
,如果某些条件为真g
,f
就会调用。g
void f(object* obj) {
// ...
if(obj->state)
g(obj);
// ...
}
我需要验证它g
实际上是被调用的,但我也不想实际执行它,因为它可以做各种各样的其他事情。这通常可以通过接口或抽象类或继承在更高级别的语言中解决。但是在 CI 中没有这些技术。
事实上,我能想到的解决这个问题的唯一方法是利用函数指针。而不是直接调用g
,我认为我应该添加一个指向object
它的指针,它有一个指向 的指针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 中解决这个问题的推荐设计模式是什么?