Menu
Coddy logo textTech

まとめ:図形の階層構造

CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 32/61。

challenge icon

チャレンジ

簡単

コンポジション(合成)による継承の力を示す、完全な図形階層を構築しましょう。まず、あらゆる具体的な図形が継承できるベースとなる Shape 型を作成し、次にそれを拡張した Rect を作成します。

コードは以下の3つのファイルに分けて構成します:

  • shape.h: インクルードガードを使用して構造体の階層を定義します。単一の color フィールド(整数型)を持つ Shape 構造体を作成します。次に、最初のメンバとして Shape を埋め込み、widthheight フィールド(共に整数型)を追加した Rect 構造体を定義します。2つの関数を宣言します:Shape* と新しい色の値を受け取る set_color、および Rect* を受け取る print_rect です。
  • shape.c: 両方の関数を実装します。set_color 関数はベース型を扱い、あらゆる図形のの色を変更します。print_rect 関数は、継承された色を含む長方形のすべての情報を表示します。
  • main.c: Rect を作成し、すべてのフィールドを初期化します。次に、長方形を Shape* にキャストして set_color を呼び出すことで、アップキャストを実演します。最後に、長方形をプリントして、ベース型のポインタを介して色が変更されたことを確認します。

入力として、長方形の width(幅)、height(高さ)、initial color(初期の色)、および汎用関数を通じて設定する new color(新しい色)の4つを受け取ります。

メインファイルでは、初期値を使用して長方形を作成し、set_color を使用してその色を新しい値に変更します(Rect*Shape* にキャストすることを忘れないでください)。最後に print_rect を呼び出して結果を表示します。

出力は以下のようになるはずです:

Width: 10
Height: 5
Color: 7

ここで、10 は幅、5 は高さ、7 は更新された色(初期の色ではありません)です。ここでの重要な洞察は、set_color は長方形について何も知らないということです。それは Shape のみを扱います。しかし、最初のメンバのルールとアップキャストを通じて、長方形の色はこの汎用関数によって変更されます。

自分で試してみよう

#include <stdio.h>
#include "shape.h"

int main() {
    int width, height, initial_color, new_color;
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%d", &initial_color);
    scanf("%d", &new_color);
    
    // TODO: Rect を作成し、すべてのフィールドを初期化する
    // (width、height、および埋め込まれた Shape の color を initial_color で初期化)
    
    // TODO: 長方形を Shape* にキャストして set_color を呼び出す
    // 色を new_color に変更するため
    
    // TODO: print_rect を呼び出して結果を表示する
    
    return 0;
}

Object Oriented Programmingのすべてのレッスン