SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Cで実現する「ぷちオブジェクト指向」

「抽象データ型」と「継承」を実現するコーディングスタイル


Opaque-type(不透明な型)の導入

 この問題を解決する方法として、1つには、void*を利用するという解があります。

Car.h
#ifndef CAR_H__
#define CAR_H__

typedef void* Car;

Car  car_new(int capacity, int mileage); /* 納車 */
void car_delete(Car car); /* 廃車 */
int  car_distance(Car car); /* 走行距離 */
void car_refuel(Car car, int amount); /* amount[L]給油 */#endif
Car.c
#include <stdlib.h> /* malloc, free */
#include "Car.h"

struct Car_type {
  int capacity_; /* タンク容量[L]   */
  int remain_;   /* ガソリン残量[L] */
  int mileage_;  /* 燃費[L/km]      */
  int distance_; /* 走行距離[km]    */
};

Car  car_new(int capacity, int mileage) {
  struct Car_type* car = malloc(sizeof(struct Car_type));
  if ( car != NULL ) {
    car->capacity_ = capacity;
    …
  }
  return car;
}

void car_delete(Car car) {
  free(car);
}

int  car_distance(Car car) {
  struct Car_type* ct = (struct Car_type*)car;
  return ct->distance_;
}

… その他モロモロ、Carに対する操作…

 これで利用者にはCar_typeそのものを見せることなく、操作(関数)だけで車を定義できました。しかし、これではコードの安全性に問題が残ります。このインターフェイスではCarvoid*なのですから、関数car_newによって確保/初期化された「正しい車」でなくとも、ポインタであればCarだとみなされてしまいます。

char* myCar = "車のつもり";
car_refuel(myCar, 50); /* コンパイルできちゃう! */

 これではあまりに危なっかしいので、typedef void* Car;を改め、

Car.h
#ifndef CAR_H__
#define CAR_H__

typedef struct Car_type* Car;

…
#endif

 とします。Cは型Xが未知であっても、関数の引数や戻り値が(Xでなく)X*ならば問題なくコンパイルできてしまうんです。利用者にはヘッダ:「Car.h」と「Car.c」をコンパイルしたライブラリが提供されます。こうすることで実装の詳細を隠し、抽象データ型として使ってもらえます。

 ただしこのスタイルでは、Car_typeを利用者に公開しないのでautomatic変数とすることができず、使用開始時に必ずcar_new、最後に忘れずcar_deleteを呼ばなくてはならない点に注意してください。

次のページ
継承

修正履歴

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/885 2007/02/14 10:06

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー