Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

C++で複数のクラスを継承した時のアップキャスト

まずはこちらのC++の挙動を見ていただこう。

class ICar {
public:
    virtual void run() = 0;
protected:
    virtual ~ICar() = default;
};

class ICamping {
public:
    virtual void camping() = 0;
protected:
    virtual ~ICamping() = default;
};

class Car: public ICar {
public:
    Car()
    {}

    void run() override
    {
    }
};

class CampingCar: public ICar, public ICamping {
public:
    CampingCar()
    {
    }

    void run() override
    {
    }

    void camping() override
    {
    }
};

int main(int argc, const char * argv[]) {
    auto car = std::make_unique<Car>();
    printf("%p %p\n",
        car.get(),
        static_cast<ICar*>(car.get()));
    //  0x100865cb0 0x100865cb0

    auto campingCar = std::make_unique<CampingCar>();
    printf("%p %p %p\n",
        campingCar.get(),
        static_cast<ICar*>(campingCar.get()),
        static_cast<ICamping*>(campingCar.get()));
    // 0x100860c10 0x100860c10 0x100860c18
    
    return EXIT_SUCCESS;
}

継承するクラスが1つの時はアップキャストしてもアドレスは変わらないが、 継承するクラスが2つの時は最初に継承したクラスへアップキャストしたときはアドレスが変わらないが、 2つ目の継承クラスへアップキャストした時はアドレスが変わっていることが分かる。 static_castはC言語の型キャストとはかなり異なる機能を持っていることが分かる。

HHKBの日本語配列キーボードでWin11のスペースキー両脇のキーをMacの動作と同じにする

HHKBの日本語配列キーボードでWin11を使う場合、スペースキー両脇のキーをMacの動作と同じにする方法を解説する。
何年かに1回はやっているがメモとして参照できるようにブログに残しておく。

Windows11の場合

  1. スタートボタン >「設定」>「時刻と言語」>「言語と地域」の順にクリック。
  2. 「日本語」の右側にある「...」から「言語のオプション」を開く。
  3. 「キーボード」の項目にある「Microsoft IME」の「...」から「キーボードのオプション」を開く。
  4. 「キーとタッチのカスタマイズ」へ進み、「各キーに割り当てる」をオンにする。
  5. 「無変換」キーに「IME-オフ」、「変換キー」に「IME-オン」を割り当てる。

これでスペースキーの左のキーで英語モード、スペースキーの右のキーで日本語かなモードに切り替わり、Macと同じ体験ができるようになる。

2次のIIRフィルタの周波数特性をDesmosで表示してみる

IIRフィルタの周波数特性の説明についてはこちらがわかりやすかったです。

デジタルフィルタの実装入門とアナログフィルタとの関係 | Haratta Tech Lab

2次のIIRフィルタの周波数特性は結局のところ伝達関数の複素数の絶対値をシータ(0からパイ)の関数としてグラフ化すれば良いのだと分かります。 作ってみたのがこちら。 複素数モードというのを使うのがミソでした。

www.desmos.com

LowPassFilterになっているのが分かります。 変数をグリグリ動かしてみると、HighPassFilterになったり、特定の周波数部分を上げたり下げたりするようなフィルターになっているのがわかります。 欲しい周波数特性を得るにはパラメータをどうやって設定したらいいのか分かりませんが、やり方はあるようです。 この記事ではここまでとします。

std::shared_ptrでmutexによってロックされる操作一覧

shared_ptr atomic_load(const shard_ptr p)
shared_ptr atomic_load_explicit(const shared_ptr
p, memory_order)
void atomic_store(shared_ptr p, shared_ptr r)
void atomic_store_explicit(shared_ptr
p, shared_ptr r, memory_order)
shared_ptr atomic_exchange(shared_ptr p, shared_ptr r)
shared_ptr atomic_exchange_explicit(shared_ptr
p, shared_ptr r, memory_order)
bool atomic_compare_exchange_strong(shared_ptr p, shared_ptr v, shared_ptr w)
bool atomic_compare_exchange_weak(shared_ptr p, shared_ptr v, shared_ptr w)
bool atomic_compare_exchange_strong_explicit(shared_ptr p, shared_ptr v, shared_ptr w, memory_order, memory_order)
bool atomic_compare_exchange_weak_explicit(shared_ptr p, shared_ptr v, shared_ptr w, memory_order, memory_order)

C++リファクタリングTIPS

  • 不要なthis経由のメソッド呼び出しのthisは取り除こう。

  • クラス名、構造体名の最後がInfo,DataならInfo,Dataは削除してOK。

  • 役割がほぼ値オブジェクトなのにclassになっているものはstructに変更し、参照部分はconst参照に変更できないか検討しよう。

  • friendの利用が適切か検討しよう。friendが必要なケースはものすごく限られるはず。

  • クラス内クラスはクラスの外に出そう。

  • namespaceの運用が適切か検討しよう。