📖
C++のライブラリの書き方
はじめに
この記事ではArduinoでLEDを操作するライブラリを例とします
1. ヘッダーファイルの用意
まずヘッダーファイルを作ります。名前は適当にled.h
とかで
作れたら以下を書きましょう
#ifndef LED_H
#define LED_H
#endif
これはインクルードガードと呼ばれるもので、これを書かないと何回もインクルードされたとき、ヘッダーファイル内で定義してある関数やクラスが複数回定義されます
2. クラス定義
クラスを定義します
#ifndef LED_H
#define LED_H
class Led {
public:
enum class State {
Off,
On
};
Led(int pin, State default_state);
void on();
void off();
void set(State state);
void toggle();
void set_default();
private:
int pin;
State state;
State default_state;
};
#endif
これでled.h
側は完成です。クラスのメソッドの中身は次の手順で書きます
3. 実装
led.h
と同じフォルダ内にled.cpp
を作ってください
作れたらled.h
をインクルードしてクラスのメソッドの中身を書きます
#include "led.h"
#include <Arduino.h>
Led::Led(int pin, Led::State default_state) {
this->pin = pin;
this->state = default_state;
this->default_state = default_state;
this->set_default();
}
void Led::on() {
this->state = Led::State::On;
digitalWrite(this->pin, HIGH);
}
void Led::off() {
this->state = Led::State::Off;
digitalWrite(this->pin, LOW);
}
void Led::set(State state) {
if (state == Led::State::On) {
this->on();
} else {
this->off();
}
}
void Led::toggle() {
if (this->state == Led::State::On) {
this->off();
} else {
this->on();
}
}
void Led::set_default() {
this->set(this->default_state);
}
4. 完成
たったこれだけです。あとはGithubで公開するなりなんなり
Discussion
default
は C++ におけるキーワード(C++11~)であり、識別子として利用することはできません。また、コンストラクタ以外のメンバ関数の定義には戻り値の型を指定する必要があります。
他にもコンストラクタの引数が宣言と定義とで異なる、セミコロンを忘れているなど、コンパイルが通らない箇所が複数あります。
ご提示のコードは検証済みでしょうか?
検証してなかったので検証して、修正しました