12

場合によっては、C で次のようにします。

typedef struct foo {
   unsigned int some_data;
} foo; /* btw, foo_t is discouraged */

オブジェクト指向の方法でこの新しい型を使用するには、次のような割り当て/解放のペアを使用できます。

foo *foo_alloc(/* various "constructor" params */);
void foo_free(foo *bar);

または、代わりに init/clear ペア (おそらくエラーコードを返す):

int foo_init(foo *bar, /* and various "constructor" params */);
int foo_clear(foo *bar);

特にMPFRライブラリで、次のイディオムが使用されているのを見てきました。

struct foo {
   unsigned int some_data;
};
typedef struct foo foo[1]; /* <- notice, 1-element array */
typedef struct foo *foo_ptr; /* let's create a ptr-type */

alloc/free と init/clear のペアは次のようになります。

foo_ptr foo_alloc(/* various "constructor" params */);
void foo_free(foo_ptr bar);
int foo_init(foo_ptr bar, /* and various "constructor" params */);
int foo_clear(foo_ptr bar);

これで、すべてを次のように使用できます (たとえば、init/clear のペア):

int main()
{  
   foo bar; /* constructed but NOT initialized yet */
   foo_init(bar); /* initialize bar object, alloc stuff on heap, etc. */
   /* use bar */
   foo_clear(bar); /* clear bar object, free stuff on heap, etc. */
}

備考: init/clear のペアは、オブジェクトの初期化とクリアのより一般的な方法を可能にしているようです。alloc/free のペアと比較して、init/clear のペアでは、「浅い」オブジェクトがすでに構築されている必要があります。「深い」構築は init を使用して行われます。

質問: 1 要素の配列「type-idiom」の明らかでない落とし穴はありますか?

4

2 に答える 2