私はCの専門家ではありません。私はCS1と大学での2日間以来、Cを何もしていません。私はあちこちで少しC++を実行しましたが、しばらく経ちました。ですから、私が求めているのは、私が認識している問題を解決するための正しいパターンです。
私はかなり野心的な挑戦に挑戦することを決心し、Cでそれを行っています。私が(再)学習していることの1つは、Cでの抽象化手法と高級言語での抽象化手法の違いです。私が遭遇し、質問している問題は、具体的にはテストと機能に関係しています。
たとえば、2つの関数が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風の方法であるかどうかはわかりません。うまくいけば、私の説明は私が直面している問題を示していますが、私が本当に疑問に思っているのは、それをどのように処理するのが最善かということです。
Cでこの問題を解決するために推奨されるデザインパターンは何ですか?