読者です 読者をやめる 読者になる 読者になる

Cでオブジェクト指向の本1

構造化(処理別)

init.c

game_mane.c

done.c

main.c

オブジェクト指向(オブジェクト別)

display.c

player.c

rabbit.c

monster.c

game.c

main.c

init(),done()->create(),destroy()に変える

 

カプセル化

例えばヘッダに

typedef struct _player{

int x;

}Player

って書いてしまうとPlayer構造体の中身を意識しなければならなくなる。

隠したい場合、

typedef struct _player *Player;

とだけ書いておいて、

.cの中で

typedef struct _player {

int x;

}_player;

として、

Player p;

p = malloc(sizeof(_player));

return p

とかやると隠蔽できる。

ほんで各オブジェクトはそれぞれのソースコードの中に隠してしまえばカプセル化完了。

 

継承

struct list{

struct list* prev;

struct list* next;

}

void insert(struct list* list, struct list *data){

data->prev = list;

data->next = list->next;

list->next->prev = data;

list->next = data;

}

typedef struct _Person{

struct list list;//mast top

int hoge;

char hoge;

}Person;

typedef struct _Car{

struct list list; //mast top

char hoge;

};

同じ実装を持ってるオブジェクトはこうやって継承させる。先頭に配置してあるので、

キャストできる。

使うときは

Person *p;

Person person;

insert*1;

 

多態性

こうやって、共通化するけども、例えばstruct list型で_Person*とか_Car*とかを扱えるわけなんだが、struct list *の変数に入れた時に同じ記述で別々の関数を呼びたい場合がある。

そのときにはcreateするときに呼ばれたい関数のポインタを渡してセットさせておく。それで、struct list 構造体に定義入れておいて、その関数ポインタをコールするようにすると、多態性ができる。

 

相互include問題

お互いインクルードしあってて、しかも、#define XXXX_H_とかをやって重複インクルードを排除していたら、ヘッダの先頭で別のヘッダをインクルードしてたら、排除されてインクルードできず、コンパイルエラーになる時がある。

結局、他のヘッダファイルの中で使用されそうな定義は他のヘッダファイルのインクルードの前においてあげる。で解決可能。先に定義しておいてあげて、それからインクルードするのでエラーにならないくなるのです。

 

そんなもんということで。

 

 

*1:struct list *)p, (struct list*)(&person