今までの知識の範囲内で「クラス」の中身がどのようになっているのか探ってみます。
クラスの特徴
基礎編パート2では、「キーボードクラス」「Switchクラス」「Stringクラス」を使ってスケッチを作成しました。
「クラス」と聞くとなんだか難しそうですし、クラスからインスタンスを生成したり、メソッドを呼び出したりしたので、クラスの中身は完全にブラックボックス、という感じですよね。
ここまでの知識だけで、クラスを完全に正確に理解するのは難しいですが、今までの知識を活用してクラスの中身の概要を見てみましょう。
クラスを使うとき、次のように宣言しました。
Switch hidariSwitch(A5);
このように宣言したスイッチクラスのインスタンスにはメソッドが用意されていて、次のように使用することができました。
hidariSwitch.poll(); // スイッチの状態を調査する
ポイントとしては、Switch
という型のインスタンスを生成して、.
をつけてメソッドを呼び出す、という点です。
これからの説明で、この点がキーになります。
クラスの考え方
インスタンス名の後に.
つけてメソッド名を書くと、そのメソッドを呼び出すことができます。
例えば、Switchクラスから生成したインスタンスは、物理的なスイッチを扱うために、次のような必要な制御方法を一通りサポートしています。
- スイッチの状態を調べる
- シングルクリックされたか確認する
- ダブルクリックされたか確認する
- 長押しされたか確認する
このようにSwitchクラスは「スイッチに関する制御方法をひとつにまとめたもの」と考えることができます。
ここで重要な点は「制御方法をひとつにまとめたもの」というところです。
かなり前の記事になってしまいますが、基礎編パート1の第44回で「構造体」という仕組みを習得しました。
「構造体」とは関係の深い変数をひとつにまとめて扱う、というものでした。
例えば2つの変数、uint16_t ontei
とuint16_t nagasa
をOto
という名前でまとめて扱いたい場合、次のようにスケッチに書きました。
// Otoという構造体
struct Oto {
uint16_t ontei; // 音程周波数の数値
uint16_t nagasa; // 音の長さの数値
};
このように定義した構造体は、例えば次のように使用します。
Oto melody;
このように書くと、Otoという変数構成(構造体)のmelody
という変数として利用できるようになります。
この構造体の中に含まれるそれぞれの変数は、次のようにスケッチで利用することができます。
melody.ontei = 262;
melody.nagasa = 200;
ちょっと複雑になってしまいましたが、構造体の特徴をまとめると以下になります。
- 複数の変数を名前をつけてまとめることができる
- 構造体名に
.
をつけて変数名を書くと、構造体の中の変数にアクセスできる
実は、「クラス」は「構造体」を拡張したようなものなんです。
クラスは構造体に似ていて、構造体の特徴に加えて、さらに次のような特徴を持っています。
- 変数に加えて、関数もまとめることができる
- インスタンス名に
.
をつけて関数名を書くと、その関数を呼び出すことができる
ということで、クラスは構造体の考え方を拡張したものだったんです。
クラスは「変数と関数を名前をつけてまとめたもの」で、まとめたものを「クラス」と呼び、まとめてある「関数」を「メソッド」と呼んでいる、というイメージです。
この説明はかなり大雑把なものですので、プログラミング本業の方からみるとかなり乱暴な説明になってしまうかもしれませんが、このような感じでイメージをつかんでいただければと思います。
実際のクラスの中身
それでは、実際のクラスの中身を見て理解を深めたいと思います。
基礎編パート2で使ったSwitchライブラリを例に説明します。
最初に、ライブラリの本体(ソースコード)の場所を確認します。
Windowsの場合は「ドキュメント」▶︎「Arduino」▶︎「Libraries」▶︎「Switch」▶︎「src」にあります。
macOSの場合は「書類」▶︎「Arduino」▶︎「Libraries」▶︎「Switch」▶︎「src」にあります。
このフォルダの中にSwitchクラスの本体があります。
クラスは主に2つのファイルから構成されています。
一つは拡張子が.h
のファイルで、ここにクラスの定義が書かれています。
「avdweb_Switch.h」というファイルを開いてみてください。
最初の方のコメントが終わると、その下の方に次のようなコードがあると思います。
class Switch
{
public:
Switch(byte _pin....
これがクラスの定義の冒頭部分です。
構造体の場合はstruct 構造体名 {
で始まっていましたよね。
クラスは構造体と似ていて、class クラス名 {
で始まります。
そのあとは、クラスが用意する関数の宣言が続きます。
関数の一番最初にSwitch()
というコードがありますよね。これがコンストラクタです。
そのあとはSwitchクラスで用意されている関数の宣言が続きます。
ところで、このファイルは関数名だけが書いてあって中身がないですよね。
拡張子が.h
ファイルで宣言した関数の中身は、拡張子が.cpp
のファイルにか書かれています。(「cpp」は「C Plus Plus」の略で、「C++」という意味になっています)
それでは同じフォルダにある「avdweb_Switch.cpp」というファイルを開いてみてください。
こちらもコメントが長く続きますが、しばらく下の方に行くと、170行目ぐらいに次のような記述があると思います。
bool Switch::poll()
{
input = digitalRead(pin);
ms = millis();
return process();
}
細かい文法は置いておいて、最初のSwitch::poll()
という記述に注目してみてください。
この意味は「Switchクラスで定義するpoll()
関数の中身をここに書きます」というような意味になります。
Switchクラスにはpoll
というメソッドがありますが、このメソッドの中身は上のようになっているんです。
poll
メソッドは、スイッチの状態を調べる、という機能がありましたが、上のスケッチでは実際にdigitalRead
関数が書かれていますよね。
ということで、基礎編パート2の最終回はちょっとわかりづらい内容になってしまいました。
クラスの中身はどのようなものなのか、雰囲気をつかんでいただければ幸いです。
長い間お疲れさまでした
基礎編パート1では、電子工作、プログラミングの最初の一歩から始めました。
基礎編パート2では、さらにややこしい内容も習得してきました。
おそらくここまでの知識が習得できれば、他の人が書いたスケッチのかなりの部分を読み解くことができると思います。
いろいろなスケッチを読んでみたり、そのスケッチを変更して動作確認すると、もっといろいろな知識がついてくると思います。
このサイトだけでなく、他のサイトや書籍なども参考にいろいろなスケッチにチャレンジしていただければと思います。
ところで、このWebサイトでは文字やイラストによる説明ですが、YouTubeで動画解説もしていますので参考にしてみてください。
https://www.youtube.com/@tool-lab
それでは、これからも電子工作やプログラミングを楽しんでください!
人生が豊かになりますよ!
更新履歴
日付 | 内容 |
---|---|
2021.12.30 | 新規投稿 |
2025.2.19 | 説明内容一部修正、補足 |