マネージャークラスの使わないコンストラクタは削除しておこう

必要のないコンストラクタは削除しよう
目次

はじめに

ゲームを作っているときにマネージャークラスを作ることはよくあると思います。モデルやテクスチャを管理するリソースマネージャーやゲームの状況を管理するゲームマネージャーなどゲーム実行中に一つしか存在させないようなクラスのことです。これらのクラスで使わないコンストラクタが存在していると思わぬところでミスをしてしまうので今回はそのミスを減らす方法を紹介します。

必要のないコンストラクタの削除

今回は必要のないコンストラクタを明示的に削除します。基本的に何も書かなければクラスを作った際にデフォルトコンストラクタなど自動で作られるものがありますが、例えばマネージャークラスの場合はコピー、ムーブコンストラクタは削除しておかないと実行中に一つしか存在してはいけないのに二つも存在してしまうことになる可能性があります。なので明示的に削除しておくことでそのクラスを使う側が変な使い方をしても大丈夫なようにしておきます。

class Manager
{
private:
  // コピー、ムーブを禁止する
   Manager (const Manager &) = delete;
   Manager (const Manager &&) = delete;
   Manager & operator=(const Manager &) = delete;
   Manager & operator=(const Manager &&) = delete;
}

自動で作成されているコンストラクタを明示的に作成して後ろにdeleteをつけるとそのコンストラクタを削除することができます。これをすることで新しくコピーをしたりすることができなくなります。

int main
{
   Manager manager;
   // コピーできない
   Manager managerCopy = manager;
  // ムーブもできない
  Manager managerMove = std::move(manager);
}

実際はシングルトンパターンを使ってデフォルトコンストラクタをprivateにしておかないといけないのですが、コピーとムーブを削除するだけでもそれなりにミスを減らせると思います。

まとめ

いかがでしたでしょうか。普段から少しでも気をつけてコーディングしておくことでミスを減らし無駄に変なバグで頭を悩ませることもなくなるのでおすすめです。

よかったらシェアしてね!
目次