復習:Greeter
CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 43/61。
チャレンジ
簡単関数ポインタを通じてポリモーフィズムを実証する Greeter システムを構築しましょう。これは、同じ構造体型でありながら、どの挨拶関数が組み込まれているかに基づいて異なる出力を生成するものです。
コードは以下の3つのファイルに分けて構成します:
greeter.h: ここで挨拶インターフェースを定義します。const char*(挨拶する名前)を受け取り、何も返さないGreetFuncという名前の関数ポインタ型を作成します。次に、language(const char*)とGreetFunc型のgreet関数ポインタを含むGreeter構造体を定義します。greeter.c: 異なる言語を表す挨拶関数を実装します:greet_english—Hello, name!と出力します。greet_spanish—Hola, name!と出力します。
main.c: ここですべてをまとめます。英語用とスペイン語用の2つのGreeterインスタンスを作成し、それぞれを対応する挨拶関数に紐付けます。入力として名前を読み込み、両方の挨拶オブジェクトでgreet関数を呼び出して、ポリモーフィックな動作を確認します。
プログラムは、挨拶する 名前 を1つ入力として受け取ります。
言語を English に設定した英語の挨拶オブジェクトと、言語を Spanish に設定したスペイン語の挨拶オブジェクトを作成します。各挨拶オブジェクトについて、その言語に続いてコロンとスペースを出力し、入力された名前を引数にして greet 関数を呼び出します。
入力が Maria の場合の出力例:
English: Hello, Maria!
Spanish: Hola, Maria!入力が Carlos の場合の出力例:
English: Hello, Carlos!
Spanish: Hola, Carlos!どちらの挨拶オブジェクトも同じ Greeter 型ですが、それぞれの greet メンバに異なる関数が割り当てられているため、異なる挨拶が生成されます。ヘッダーファイルではインクルードガードを使用することを忘れないでください。
自分で試してみよう
#include <stdio.h>
#include <string.h>
#include "greeter.h"
int main() {
// 名前の入力を読み込む
char name[100];
scanf("%s", name);
// TODO: 英語の挨拶(greeter)を作成する
// - 言語を "English" に設定する
// - greet を greet_english 関数に設定する
// TODO: スペイン語の挨拶(greeter)を作成する
// - 言語を "Spanish" に設定する
// - greet を greet_spanish 関数に設定する
// TODO: 各挨拶(greeter)に対して:
// 1. 言語を表示し、その後に ": " を表示する
// 2. 名前を引数にして greet 関数を呼び出す
return 0;
}