📖

C++のライブラリの書き方

2024/05/02に公開
2

はじめに

この記事では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で公開するなりなんなり

GitHubで編集を提案

Discussion

yaito3014yaito3014

default は C++ におけるキーワード(C++11~)であり、識別子として利用することはできません。
また、コンストラクタ以外のメンバ関数の定義には戻り値の型を指定する必要があります。
他にもコンストラクタの引数が宣言と定義とで異なる、セミコロンを忘れているなど、コンパイルが通らない箇所が複数あります。
ご提示のコードは検証済みでしょうか?