🐏

C++ 構造体を使うと何が嬉しいのか理解する

2024/04/05に公開

構造体のない世界

何らかの概念を理解するには、その概念が無かったらどう困るのか想定することで概念に対する理解を深められる場合があります。さらに、その概念をどういう状況で使えばいいのか把握できるので一石二鳥ですね。

ここでは、英単語の勉強に役立つアプリ開発をしている場面を考えてみましょう。英単語に関するデータを扱う際に少なくとも次の 4 つの情報があると嬉しいですね。

4つの情報
単語ID:~
日本語:~
英語:~
最終閲覧日:~

こういった情報を構造体のない世界で書くと次のような書き方になりそうですよね。

構造体のない世界での書き方
#include <iostream>
#include <string>
using namespace std;

int main() {
    // 1つ目の単語
    const int WORD_ID_1 = 1;
    string japanese_1 = "こんにちは";
    string english_1 = "Hello";
    string last_view_day_1 = "2024/01/01";

    // 2つ目の単語
    const int WORD_ID_2 = 2;
    string japanese_2 = "ありがとう";
    string english_2 = "Thank you";
    string last_view_day_2 = "2024/01/05";

    // 3つ目の単語
    const int WORD_ID_3 = 3;
    string japanese_3 = "さようなら";
    string english_3 = "Goodbye";
    string last_view_day_3 = "2024/01/10";

    // 1つ目の単語の情報を表示
    cout << "単語ID: " << WORD_ID_1 << endl;
    cout << "日本語: " << japanese_1 << endl;
    cout << "英語: " << english_1 << endl;
    cout << "最終閲覧日: " << last_view_day_1 << endl;
    return 0;
}

このコードの問題点をいくつか挙げてみましょう。

  • 変数名に数字が振ってありますが、あまり意味のない名前です。
    • WORD_ID_1 の代わりに WORD_ID_hello としても良いですが、定数なのに英小文字が混ざっているので違和感があります。
    • 仮に WORD_ID_HELLO としても japanese_HELLO の部分で同様の問題が再発します。
  • 1 つの単語につき 4 つの情報がありますが、これらが 1 つのデータとしてまとまっていません。
    • 今回は 4 つの情報で構成されていますが、より情報を増やすと 1 つのデータとして捉えるのが難しくなります。
  • 今後、単語数を増やすとたくさんの変数が必要になります。
    • 1 つの単語に対して複数個の変数名を考える必要があり、スペル入力ミスや表示する情報の指定ミスも起きやすくなります。

構造体のある世界

それでは、これらの問題が構造体のある世界ではどのように解決されるのか見ていきましょう。まず、複数の情報を 1 つのデータとして扱えるようにしたいですね。そのためには struct キーワードを用いて構造体というものを用意します。

構造体の例
struct word {
    const int ID;
    string japanese;
    string english;
    string last_view_day;
};

序盤のコードを構造体を使って書き換えると次のようになります。

構造体のある世界での書き方
#include <iostream>
#include <string>
using namespace std;

// 構造体
struct word {
    const int ID;
    string japanese;
    string english;
    string last_view_day;
};

int main() {
    // 1つ目の単語
    word hello = {1, "こんにちは", "Hello", "2024/01/01"};

    // 2つ目の単語
    word thank_you = {2, "ありがとう", "Thank you", "2024/01/05"};

    // 3つ目の単語
    word goodbye = {3, "さようなら", "Goodbye", "2024/01/10"};

    // 1つ目の単語の情報を表示
    cout << "単語ID: " << hello.ID << endl;
    cout << "日本語: " << hello.japanese << endl;
    cout << "英語: " << hello.english << endl;
    cout << "最終閲覧日: " << hello.last_view_day << endl;
    return 0;
}

用意すべき変数が 3 つほどになり、情報を表示する際にも hello.last_view_day のように直感的に分かりやすいものとなっていますね。

以上で構造体の説明は終わりです。
どうでしょうか。構造体の嬉しさが伝われば幸いです。

Discussion