マイクロコントローラーの周辺機器 (adc、ポート、usart など) にアクセスして制御するクラスをいくつか設計しています。デバイスには各ペリフェラルのインスタンスがいくつか (場合によっては 1 つだけ) しかないため、各ペリフェラルをモノステート クラスとして表すことにしました。私のクラスの定義と使用法は次のようになります。
usart.h
class usart {
public:
static void init() { /* initialize the peripheral */ }
static char read() { /* read a char from the input buffer */ }
static void write(char ch) { /* write a char to the output buffer */ }
// ... more member functions
};
main1.cpp
#include "usart.h"
int main()
{
usart::init();
char data;
while (true) {
data = usart::read();
usart::write(data);
}
}
しかし、上記の usart クラスの定義方法は、ユーザーが次のようなことを行うことを禁止していません。
main2.cpp
#include "usart.h"
int main()
{
// I don't want object construction
usart serial1;
usart serial2;
// neither assignment
serial1 = serial2;
// two objects representing the same hardware resource
// I don't want that
serial1.init();
serial2.write('r');
}
C++11 以降、deleteキーワードを使用して、コンパイラがデフォルトのコンストラクタと関数を作成しないようにすることができますが、コンパイラが作成するデフォルトが何であるかは正確にはわかりません。コピー コンストラクター、コピー割り当て、ムーブ セマンティクス オーバーロードなどがあります。自分のクラス (およびどの関数とコンストラクター) にいくつのdeleteを配置する必要がありますか?
更新: クラスの代わりに名前空間を使用できる (そして使用する必要がある) ことはわかっていますが、後でそれらのクラス (または名前空間) をテンプレート引数として渡す必要があるのではないかと心配しています。私の知る限り、名前空間をテンプレート引数として使用することはできません。そのため、名前空間の代わりに静的メンバーを持つクラスを使用することを選択しました。