gcc (GCC) 4.7.2
c89
私は C でいくつかのオブジェクト指向スタイルを使用する練習を行っています。これは、いくつかの大規模なプロジェクトでこれを行いたいためです。
ただし、以下のコードでは、親構造 car と子 sports_cars があります。ただし、すべての共通属性または car 構造体は子構造に存在します。
私が持っている質問が 1 つあります。それは init 関数と destory 関数です。それらは一般的であるため、子構造に init と destroy を継承させたいと考えています。しかし、私はそれを間違っていると思います。
car->init = init_car;
init_car を指している init 関数ポインタがあるので、私には正しく見えません。
ご提案いただきありがとうございます。
#include <stdio.h>
#include <stdlib.h>
typedef struct tag_car car_t;
struct tag_car {
size_t wheels;
char *name;
void (*init)(void *self);
void (*destroy)(void *self);
size_t (*wheels_get)(void *self);
void (*wheels_set)(void *self, size_t num_wheels);
};
typedef struct tag_sports sports_t;
struct tag_sports {
car_t base_car;
size_t top_speed;
size_t (*top_speed_get)(void *self);
void (*top_speed_set)(void *self, size_t max_top_speed);
};
void destroy_car(void *self)
{
car_t *car = self;
free(car);
}
void init_car(void *self)
{
car_t *car = car;
car->wheels = 4;
car->name = NULL;
car->init = init_car;
car->destroy = destroy_car;
}
size_t wheels_count_get(void *self)
{
car_t *car = self;
return car->wheels;
}
void wheels_count_set(void *self, size_t num_wheels)
{
car_t *car = self;
car->wheels = num_wheels;
}
size_t sports_top_speed_get(void *self)
{
sports_t *sports_car = self;
return sports_car->top_speed;
}
void sports_top_speed_set(void *self, size_t max_top_speed)
{
sports_t *sports_car = self;
sports_car->top_speed = max_top_speed;
}
sports_t* init_sports()
{
sports_t *sports_car = malloc(sizeof(sports_t));
/* Parent struct */
sports_car->base_car.init = init_car;
sports_car->base_car.destroy = destroy_car;
sports_car->base_car.wheels_get = wheels_count_get;
sports_car->base_car.wheels_set = wheels_count_set;
/* Child struct */
sports_car->top_speed_set = sports_top_speed_set;
sports_car->top_speed_get = sports_top_speed_get;
return sports_car;
}
int main(void)
{
sports_t *farreri = init_sports();
sports_t *lamborghini = init_sports();
farreri->base_car.wheels_set(farreri, 10);
farreri->top_speed_set(farreri, 240);
printf("farreri has wheel count [ %ld ]\n", farreri->base_car.wheels_get(farreri));
printf("Farreri has a top speed [ %ld ]\n", farreri->top_speed_get(farreri));
lamborghini->base_car.wheels_set(lamborghini, 6);
lamborghini->top_speed_set(lamborghini, 220);
printf("lamborghini has wheel count [ %ld ]\n", lamborghini->base_car.wheels_get(lamborghini));
printf("Lamborghini has a top speed [ %ld ]\n", lamborghini->top_speed_get(lamborghini));
farreri->base_car.destroy(farreri);
lamborghini->base_car.destroy(lamborghini);
return 0;
}