←モドル。

Cでオブジェクト指向(もどき)


Cってのは基本的に手続き指向型の言語なのだけれど、工夫すればなんとかオブジェクト指向のソフトウェアを実現することができる。 その利点は何か、ってゆうと、何もない気がする(汗) コード数も、C++とかJavaで書くより増えるし・・・。 (といいながらC++は使ったこと無い)

仕事でObjectPascalというオブジェクト指向言語で作られたツールをCで移植っていう意味のわかんない指令が出たので、 大学の時を思い出してやってみたらけっこういけたのでメモしておきます。
#でもツールは完全なオブジェクト指向じゃなくってもどきって感じなんだけど


ルール
こんなかんじ。

うーん、わかりにく。


例はこんなかんじ。

javaでかくとこんなかんじ

Object.javaセンスない名前・・・

class Object{
  private String str;

  public void setStr(String str){
    this.str = str;
  }

  public String getStr(){
    return this.str;
  }
}

Main.java
class Main{

  public static void main(String args[]){
    Object object = new Object();

    object.setStr("Hello World");

    System.out.print(object.getStr() + "\n");
}

それをCで書くとこんなかんじ

Object.h

//クラスのメンバ変数を構造体で定義する
typedef struct{
  char str[1024];
}object_m;

//オブジェクトの代わりをする構造体
typedef struct{
  object_m member; //メンバ変数を構造体で保持しておく
  //メソッドは関数ポインタとして保持
  void (*setStr)(object_m *member, char *str);
  char *(*getStr)(object_m *member);
}Object;

//メソッドとなる関数のプロトタイプ宣言をしておく
void setStr(object_m *member, char *str);
char *getStr(object_m *member);

Object.c
#include 
#include 
#include "Object.h"

void setStr(object_m *member, char *str){
  strcpy(member->str, str);
}

char *getStr(object_m *member){
  return *(member->str);
}

Main.c
#include 
#include "Object.h"

int main(void){
  Object object;

  //クラスを模した構造体のなかにある関数ポインタと関数をむすびつける
  object.setStr = setStr;
  object.getSrt = getStr;

  object.setStr(&object.member, "Hello World");
  
  printf("%s\n", object.getStr(&object.member));
}


*javaはこれで確実にうごくと思うけどCはコンパイルチェックして無いのでちょっと自信なし


実行結果
は、当たり前だけどどっちもHello Worldって表示される。
これだけじゃあちょっとわかりにくいかも・・・・ もう少し複雑なOOPのサンプルコードを、時間があったらかんがえよーっと。
#多分そんな時間は無い


←モドル。