第26回 補足 – クラスの中身

今までの知識の範囲内で「クラス」の中身がどのようになっているのか探ってみます。

目次

クラスの特徴

基礎編パート2では、キーボードクラスとスイッチクラスを使ってスケッチを作成しました。

とはいっても、クラスってなんだかよくわからないですよね。

現時点の知識だけではクラスを正確に理解するのは難しいですが、今までの知識を活用してクラスの中身の概要を見てみましょう。

クラスを使うとき、以下のように宣言しましたよね。

Switch hidariSwitch(23);

このように宣言したスイッチクラスのインスタンスには、メソッドが用意されていて以下のように使用することができました。

hidariSwitch.poll();  // スイッチの状態を調査する

クラスの考え方

このようにクラスから生成したインスタンスは、「.」(ピリオド)で機能を呼び出すことができます。

例えばスイッチクラスから生成したインスタンスは、物理的なスイッチを扱う場合に必要な制御方法を一通りサポートしています。「スイッチの状態を調べる」「シングルクリックされたか確認する」「ダブルクリックされたか確認する」などです。

このようにスイッチクラスは、スイッチに関する制御方法をひとつの組にまとめたもの、と考えることができます。

ここで重要な点は「制御方法をひとつの組にまとめたもの」というところです。

かなり前の記事になってしまいますが、基礎編パート1の第44回で説明した「構造体」というC言語の文法を覚えているでしょうか。

「構造体」とは関係の深い変数をひとつの組にまとめて扱う、というものでした。

例えば2つの変数、uint16_t onkaiuint16_t nagasaotoという名前の組として扱いたい場合、以下のようにスケッチに書きました。

struct oto {
  uint16_t onkai;
  uint16_t nagasa;
};

このように定義したい構造体は、例えば以下のように使用します。

struct oto melody;

このように書くと、melodyという構造体の変数として利用できるようになります。例えば以下のようにスケッチで利用することができます。

melody.onkai = 262;
melody.nagasa = 200;

ちょっと複雑になってしまいましたが、構造体の特徴をまとめると以下になります。

  • 複数の変数を名前をつけて組にすることができる
  • 構造体に「.」をつけて変数名を書くとアクセスできる

クラスは構造体の拡張版のようなものになっています。クラスは構造体に似ていて以下のような特徴を持っています。

  • 複数の関数を名前をつけて組にすることができる
  • インスタンスに「.」をつけて関数を書くとアクセスできる

ということで、クラスは構造体の考え方を拡張したものだったんです。

とはいってもこのような説明をすると、プログラミング本業の方からすると乱暴な説明になってしまうかもしれません。

でもクラスは「関数を名前をつけて組にしたもの」で、「関数」を「メソッド」と呼び、組にしたものを「クラス」と呼んでいるに過ぎません。

実際のクラスの中身

それでは、実際のクラスの中身を見て終わりにしましょう。

基礎編パート2では、キーボードクラスとスイッチクラスを使いました。

キーボードクラスのソースコードファイルはシステムの中に入っているため、アクセスしやすいスイッチクラスのソースコードを見てみましょう。

Windowsの場合は「ドキュメント」→「Arduino」→「Libraries」→「Switch」、macOSの場合は「書類」→「Arduino」→「Libraries」→「Switch」を開いてみてください。

このフォルダの中にスイッチクラスの本体があります。クラスは主に2つのファイルから構成されています。

一つは拡張子が「h」のファイルで、ここにクラスの定義が書かれています。

「avdweb_Switch.h」というファイルを開いてみてください。最初の方のコメントが終わってちょっと下の方に

class Switch
{
public:
  Switch(byte _pin....

と書かれている部分があります。

これがクラスの定義の冒頭部分です。

構造体の場合はstruct タグ名 {で始まっていましたよね。

クラスは構造体と似ている感じで、class クラス名 {で始まります。

そのあとは、クラスが用意する関数の宣言が続きます。

関数の一番最初に「Switch()」という関数がありますよね。これがコンストラクタです。そのあとはスイッチクラスで用意されている関数の宣言が続きます。

ところで、関数の中身はどこにあるのでしょうか。

クラスで宣言した関数の中身は、拡張子が「cpp」のファイルにか書かれています。「cpp」は「C++」、つまり「C plus plus」の略になっています。

それでは同じフォルダにある「avdweb_Switch.cpp」というファイルを開いてみてください。

こちらもコメントが長く続きますが、しばらく下の方に行くと、120行目ぐらいに以下のような記述があると思います。

bool Switch::poll()
{ input = digitalRead(pin);
  ms = millis();
  return process();
}

細かい文法は置いておいて、最初のSwitch::poll()という記述に注目してください。

この意味は「Switchクラスで定義するpoll()関数の中身をここに書きます」というような意味になります。

ということで、基礎編パート2の最後はちょっとわかりづらい内容になってしまいましたが、クラスの雰囲気をつかんでいただければ幸いです。

長い間お疲れさまでした

基礎編パート1では電子工作、プログラミングの最初の一歩から始めました。パート2までの記事でプログラミングの基礎の基礎の部分まで説明したつもりですが、いかがだったでしょうか。

プログラミングは、実際にたくさん作ってみないとなかなか身につきません。このサイトだけでなく、他のサイトや書籍なども参考にいろいろチャレンジしてみてください。

ところで、このシリーズを書いていてやはり文字だけでは限界を感じる部分もありました。2022年からはYouTubeなどのプラットフォームを活用して動画による説明にも挑戦してみたいと思います。

それではこの先も電子工作やプログラミングを楽しんでください!

更新履歴

日付 内容
2021.12.30 新規投稿
通知の設定
通知タイミング
guest
0 コメント
本文中にフィードバック
全てのコメントを見る
目次