2011-07-31 26 views
1

は、私はCで次のようになりますPIMPL-イディオムについて知っPIMPL-イディオム対の実装を非表示にするには:型キャストの構造体は、

型キャストを持つしかし
// foobar.h 
struct FooBar { 
    char *someString; 
    struct FooBarImpl *pImpl; 
}; 
// foobar.c 
struct FooBarImpl { 
    char *hiddenString; 
}; 

私は不透明なポインタを取り除くとオッズを減らすことができますその誰かが実装で台無し:FooBarの上で操作を行っている任意の関数は単に「プライベート」のメンバーへのアクセスを得るためにFooBarImplに型キャストでしょう。後者の場合には

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

FooBarにいくつかのメンバーを追加するが、FooBarImplに同じメンバーを追加する人がいれば、これがどのように問題になるかを見ることができます。しかし、私の場合、FooBarにはメンバーが1人しか含まれていないため、変更はほとんどありません。

実装の詳細を隠そうとしている場合、これは良い習慣とみなすか、または単にpimpl-idiomに固執すべきですか?

ありがとうございます。

答えて

2

コンパイラはあなたの友人です。明示的な型キャストを使用して、特に複合型の間でそれを不正にしないでください。あなたがその内容を明らかにする必要はないだろう実装構造体を前方宣言するなら、最初のメソッドに固執する。

0

あなたは、構造体の間に型キャストのコードで作業するときに非常に慎重でなければならないであろう。

  1. あなたはFooBarの配列を作成したり、クライアントコードに、このような配列へのポインタを提供していませんでした。
  2. FooBarではなく、FooBarImplを割り当てる必要があります。そうしないと、実装固有のデータが途切れることになります。
  3. ライブラリのユーザーは、memcpyingまたはFooBar構造体の割り当てまたは作成が正しいと誤って判断する可能性があります。結局のところ、含まれていると思われるものはすべて簡単に埋め込むことができる基本データです。
関連する問題