ハッシュマップデータ構造のイテレータインタフェースを設計しています。現在の設計は、次のようになります。定義がない不透明な構造体
// map.h
typedef struct map_iterator map_iterator;
// map.c
struct map_iterator
{
// Implementation details
};
// client.c
map *m = map_new();
map_iterator *it = map_iterator_new(m);
void *key, *value;
while (map_iterator_next(it, &key, &value)) {
// Use key, value
}
map_iterator_free(it);
しかし、これはイテレータオブジェクトのヒープ割り当てを必要とし、クライアントは、彼らが完了したら、イテレータを解放するために覚えておく必要があります。私は、スタック上のイテレータを返すmap_iterator_new
作る場合は、コードは次のようになります。
// map.h
typedef struct map_iterator
{
// Implementation details
};
// client.c
map *m = map_new();
map_iterator it = map_iterator_new(m);
void *key, *value;
while (map_iterator_next(&it, &key, &value)) {
// Use key, value
}
しかし、これは私が(そうでない場合、私は不完全な型のエラーを取得する)クライアントコードにmap_iterator
構造体の定義を提供する必要があります。私はこの定義を隠し、宣言だけを提供したいと思います。
これを達成する方法はありますか?基本的に、クライアントコードに "この構造体はXバイトを占有してスタックに割り当てることができますが、メンバーにアクセスする方法は教えていません"と伝える方法を探しています。
編集:標準Cのみ、してください! (コンパイラ拡張/プラットフォーム固有の関数なし)
イテレータの「実装の詳細」には何がありますか? – 2501
@ 2501イテレータ状態。ハッシュマップへのポインタ、現在のバケットインデックス、変更回数など –
イテレータへのポインタを提供して後で解放することは問題ではないと思います。カールのような多くのライブラリもこのようなインタフェースを提供します。私はむしろ2番目のオプションよりも最初のオプションを使用したいと思います。 – ckruczek