1

私は、C では次のようになる pimpl-idiom について知っています。

// foobar.h
struct FooBar {
    char *someString;
    struct FooBarImpl *pImpl;
};
// foobar.c
struct FooBarImpl {
    char *hiddenString;
};

ただし、型キャストを使用すると、不透明なポインターを取り除き、誰かが実装を台無しにする可能性を減らすことができます。

// foobar.h
struct FooBar {
    char *someString
};
// foobar.c
struct FooBarImpl {
    // FooBar members
    char *someString
    // FooBarImpl members
    char *hiddenString
};

後者の場合、FooBar で操作を行う関数は、単純に FooBarImpl に型キャストして、「プライベート」メンバーへのアクセスを取得します。

たとえば、あるメンバーを FooBar に追加するが、FooBarImpl には同じことをしない場合、これがどのように問題になるかがわかります。ただし、私の場合、FooBar には 1 つのメンバーのみが含まれ、変更される可能性はほとんどありません。

これは良い習慣と見なされますか、それとも実装の詳細を非表示にしたい場合は pimpl-idiom に固執する必要がありますか?

ありがとうございました。

4

2 に答える 2

2

コンパイラはあなたの友達です。特に複合型間で、明示的な型キャストを使用してごまかさないでください。最初の方法に固執してください。実装構造体を前方宣言する場合、その内容を明らかにする必要はありません。

于 2011-08-01T00:00:40.560 に答える
0

構造体間で型キャストするコードを扱うときは、非常に注意する必要があります。

  1. FooBar の配列を作成したり、そのような配列へのポインターをクライアント コードに提供したりすることはできませんでした。
  2. 構造体 (それらのポインターではない) を割り当てるか memcpy:ing するには、FooBar ではなく FooBarImpl を割り当てる必要があります。そうしないと、実装固有のデータが切断されます。
  3. ヘッダーを見ると、ライブラリのユーザーは、FooBar 構造体の memcpying、割り当て、または作成が正しいと誤って想定する可能性があります。結局のところ、含まれているように見えるのは、簡単に入力できる基本データだけです。
于 2011-08-01T01:06:41.637 に答える