読者です 読者をやめる 読者になる 読者になる

ご冥福をお祈りします


任天堂の岩田社長が逝去されたそうです。

確かにやせてはいたけど、亡くなるなんて、そんな様子全然なかったのに!
めっちゃショックΣ(゚д゚lll)


ご冥福をお祈りします。

【C++】private コンストラクタに、メンバ関数から呼ばれた外部の関数からアクセスする

かなり限定的ですが、タイトルのような状況にぶち当たったので。


コンストラクタを private にして、create() みたいな static メンバ関数を作ってオブジェクトを作成するというイディオムがあります。

class hoge {
  hoge() { }  // private コンストラクタ

public:
  // この関数を使わないと、hoge オブジェクトは作成できない
  static hoge* create_hoge() {
    static hoge h;
    return &h;
  }
};

シングルトンなんかを実装するときに使われるテクニックですね。

続きを読む

【C++11】スコープ付きenum

通常のenumの列挙子は、その enum が定義されているスコープに属すため、同じスコープに列挙子と同じ名前の変数などがあると名前の衝突が起こります*1

int White;
enum Color { Black, White };  // エラー! White を再定義している

衝突を避けるために、

// こんな感じで頭に型名をつけるとか、
enum Color { Color_Black, Color_White };
Color color = Color_White;

// 構造体などの別のスコープに突っ込むとかする必要がある
struct Color {
    enum ColorType { Black, White };
};
Color::ColorType color = Color::White;

上のような工夫をする必要がありました。


C++11からは、enum classもしくはenum structを使えば、enum型名::列挙子」の形のアクセスができるようになりました(スコープ付き列挙型)。

int White;
enum class Color { Black, White };  // OK

// 型名::列挙子でアクセスする
Color color = Color::White;

スコープ付き列挙型におけるclassstructの間に違いはないらしいです。
また、列挙子単体でのアクセスはできません。

*1:列挙子と同じ名前のクラスなどは定義できる