Lyの日常

主が楽しくプログラムをカキカキするブログ

シングルトンパターン in C++

ふっ、とうとうここまでたどり着いてしまったか
そうだ、この私がシングルトンパターンだ!

*クラスを勉強し始めた人向けです

あっはい
どうもLyです
シングルトン便利です、ω、

シングルトンの利点はクラスのインスタンス(クラス内のデータ)を
グローバルと同じように扱えること
あとはそのクラスが唯一になること

始めにSingletonクラスを宣言してみましょう

class Singleton {};

int main() {
  Singleton singleton;
  // このままではSingletonクラスを複製できてしまう
  // Singleton singleton2;
}

クラスが宣言されたとき呼ばれるのは
コンストラクタです
クラスと同じ名前の関数です
基本的にこのコンストラクタでデータの初期化をしますね

class Singleton {
public:
  Singleton(){} // ←こいつですね
};

では、さきほどのようにコンストラクタを書かない場合どうなるのか
それはコンパイラが勝手にpublicな空間に作成してくれます

コンストラクタはクラスが宣言されたとき呼ばれます
逆にコンストラクタが無いと宣言が出来なくなります

// コンストラクタをprivateに置く
class Singleton {
private:
  Singleton(){}
};

int main() {
  Singleton singleton; // err
}

クラスが宣言できないとそもそもクラスにアクセスできない!
というわけでもなく
クラスのpublicな空間にstaticな関数をおけば実はアクセスできます

class Singleton {
private:
  Singleton(){}

public:
  static Singleton& getInstance {
    static Singleton singleton;
    return singleton;
  }
};

やっていることはいたって単純で
クラスの中でクラスを作成しているだけです
そして作成したクラスを出力する関数を作っています

クラスのデータにアクセスする場合は
こんな風にアクセスします

int main() {
  Singleton::getInstance();
}

Singleton::getInstance()
これは
getInstance関数の中で宣言されたsingletonと同等です

なので、例えばPlayerクラスをシングルトンにした場合

class Player {
private:
  Player(){}
  
  Vector2f pos;
public:
  static Player& getInstance() {
    static Player player;
    return player;
  }

  Vector2f getPos() { return pos; }
};

int main() {
  Vector2f player_pos;
  player_pos = Player::getInstance().getPos();

  std::cout << "プレイヤーの現在地 x("
            << player_pos.x << ") y("
            << player_pos.y << ") \n";
}

という風にアクセスします

もっと詳しくシングルトンについて知りたい場合は
WikiへGO!
((ってググったら真っ先にWiki出ると思うけどw

Hello Hatena Blog!

。ω。っは!?
ここはどこだ!

この男の名はLy
本名を梁井(ヤナイ)亮(アキラ)と呼ぶ
Lyというのはネトゲで使っている名前である

Lyはゲームプログラム専門学校に通っている
普段は部屋に引きこもっているゲーマーである
ちなみにPSO2やってます(10鯖です、ω、)

3年制で現在2年生のLyは最近
Cinderというライブラリを使って作成したゲームが
審査会(他で言うところの期末テスト=期末審査会)で
優秀賞をもらったので浮かれているところだ

Youtubeにあげてたりもする((よかったら見てやってください、ω、www.youtube.com

GetSpeed(上の作品)のソースコードはGitで公開しているgithub.com
((よかったら見ていってね、ω、


なんか物語風自己紹介してみた

#include <iostream>
int main() {
  std::cout << "Hello Hatena Blog!";
}