ネストされた構造体を使用して、プレーンCで一種の「構造体継承」を作成しています。たとえば、次のような構造体がいくつかあります。
struct a {
obj_type type_id;
int x;
int y;
}
struct b {
struct a super;
char* str;
}
struct c {
struct a super;
int* data;
bool flag;
}
次に、次のように列挙型を作成します。
typedef enum {
OBJ_TYPE_A,
OBJ_TYPE_B,
OBJ_TYPE_C
} obj_type;
これにより、さまざまなオブジェクトがどの構造体であるかを確認しtype_id
、対応する構造体にキャストすることで、継承をシミュレートできます。私の問題は、親構造体のプロパティを手動で定義x
せずに、これらの「子」構造体を初期化できるようにしたいということです。y
基本的に、私はこのようにポインタを初期化することができます:
struct b obj_b = { OBJ_TYPE_B, 0, 0, "foo" };
struct b *ptr_b = malloc(sizeof(struct b));
memcpy(ptr_b, &obj_b, sizeof(struct b));
ただし、初期化を行う関数がa
必要なので、次のようにすることができます。
struct b *ptr_b = object_create(OBJ_TYPE_B, { "foo" }, sizeof(struct b));
私はこのような関数の実装のようなものを作成しました:
const struct a DEFAULT_A = { OBJ_TYPE_A, 0, 0 };
struct a object_create(obj_type type, void* data_ptr, size_t size) {
struct a new_obj = malloc(size);
memcpy(new_obj, &DEFAULT_A, sizeof(struct a));
memcpy(new_obj + sizeof(struct a), data_ptr, size - sizeof(struct a));
return new_obj;
}
ただし、次のようなことを行う方法がないため、これを実際に使用することはできません。
struct b *ptr_b = object_create(OBJ_TYPE_B, &{ "foo" }, sizeof(struct b));
関数に渡す一種の「匿名」データブロックを作成する方法はありますか?それとも、仕事をするためにマクロのようなものに頼らなければなりませんか?