Flat Leon Works

アプリやゲームを作ってます。

C++

【C++アイデア】ラムダ式で発生しがちな不正な参照(ダングリングポインタ)を回避する

C++

C++11から導入されたラムダ式はとても便利な機能ですが、その使われ方から不正な参照いわゆるダングリングポインタが発生しやすい機能でもあります。今回はその回避策を考えてみます。 なぜ不正な参照(ダングリングポインタ)が発生しやすいのか 不正な参照の…

【C++】C++関連ブックマーク

C++

C++関連でよく使うサイトや気になった記事をここにまとめておきます。 リファレンス cppreference.com : 有志で運営されているらしいC++のリファレンスサイト。情報が非常に充実している cpprefjp - C++日本語リファレンス : 日本語のC++リファレンスサイト…

【C++】弱参照クラスを自作する

C++

C++11から標準ライブラリにstd::weak_ptrが入りました。std::weak_ptrを使うことで弱参照を行えるようになるのですが、ちょっと使い勝手が悪いので弱参照クラスを自作してみました。 ちなみに、弱参照の良さについてはこちら↓で紹介しています。 【C++】弱参…

【C++】弱参照のすすめ

C++

弱参照というものをご存知でしょうか。弱参照はとても便利で個人的にも気に入っている仕組みなのですが、この便利さがあまり知られていないような気がします。そこで今回は弱参照の良さを紹介したいと思います。 (注意) この記事はC++を前提としています。他…

【C++】初期化子リスト関連機能を大雑把に理解する

C++

C++11から初期化子リストが導入されました。初期化子リストは簡単に見えて結構難しい機能です。そこで初期化子リストを大雑把に理解するための記事を書いてみることにしました。理解することを優先しているので言葉の定義などが不正確だったりするかもしれま…

【C++】C++14勉強メモ

C++

「C++11のお勉強」に続いて、C++14のお勉強です。 2進数リテラル 通常関数での戻り値型の型推論 decltype(auto) 後置き戻り値型でのauto ラムダ式の初期化キャプチャ ジェネリックラムダ 変数テンプレート constexprの制限緩和 deprecated属性 数値リテラル…

【C++】C++11以降の戻り値型の記述方法まとめ

C++

C++11になり、後置き戻り値型、auto型、ラムダ式が導入され、戻り値の記述方法が大幅に増えました。またC++14でさらに新しい記述方法が加わったのでとてもややこしいことになっています。そこで戻り値型の記述方法をまとめてみることにしました。(勉強中のた…

【C++】C++11勉強メモ

C++

ずっとC++03縛りを続けてきましたが、そろそろC++11に手を出してもいいだろうと思いC++11の勉強を始めてみました。C++11の情報はcpprefjpさんのページを参考にしています*1。 新機能/変更点 auto decltype 範囲for文 初期化子リスト 一様初期化 ムーブ(ムー…

NimとC++を比較してみる

この記事は「Nim Advent Calendar 2017」の記事として登録させてもらっています。 NimはNimソースコードをC言語ソースへ変換するトランスコンパイラ言語です。これは普段C++を使っている人にとって非常に重要なことです。なぜなら、C++(C言語)が使える環境な…

ゲームエンジンを使わずにC++とOpenGLでゲームを作った話

先日、iOS用ゲームアプリ「センメツコースター」をリリースしました。このゲームの開発にはゲームエンジンは使っておらず、C++とOpenGLとOpenALなどで実装されています。最近はゲームエンジンを使うことが当たり前になっており、ゲームエンジンを使わないゲ…

【C++ アイデア】複数の名前空間に同じ別名を与える

C++

C++では名前空間に別名を与えることができます。 namespace HogeCore {} namespace Hoge = HogeCore; しかし、複数の名前空間に同じ別名を与えることはできません。 namespace HogeCore {} namespace HogeGraphics {} namespace HogeAudio {} namespace Hoge…

Xcode7.3へのアップデート後、C++プロジェクトのビルド時間が異様に長くなる問題への対処

Xcode7.3へアップデート後、QtCreatorのC++プロジェクトのビルド時のリンク時間がやたら遅いなと思っていましたが解決法が書かれたページを見つけ、試してみたところ治ったので共有したいと思います。 ※Xcode自体でのビルドではなく、Xcode付属のClangを使っ…

【C++ アイデア】関数内でメンバ変数を定義する

C++

メンバ関数の中でメンバ変数の定義ができたら便利だろうなと思ったので、方法を模索してみました。半分ネタです。 やりたいのはこういう感じのことです。 class A { int m_Value; // こっちは普通のメンバ変数 public: void Func( void ) { local int m_Stat…

【C++】宣言と定義の早見表

宣言と定義の早見表 宣言だけの書き方は忘れがちなので早見表を作ってみました。 注意 : 一応コンパイルが通ることを確認していますが、もしかしたら間違った書き方をしているかもしれません。 宣言のみ定義(宣言を含む場合あり)備考 グローバル変数extern i…

【C++】個別に未使用変数の警告を抑制する方法

未使用変数の警告 C++はコンパイル時のオプションにより未使用変数の警告が出る場合があります。未使用変数というのはその名の通り、宣言したのに使っていない変数のことです。この未使用変数の警告が一番出やすいのは関数の仮引数の変数です。特に仮想関数…

【C++ アイデア】戻り値をチェックするアサート

アサートの罠 アサートは便利なものですが、油断するとこんなコードを書いてしまうかもしれません。 #include <stdio.h> #include <assert.h> class A { int m_Value; public: A() : m_Value( 0 ){} // 値をセットします。戻り値はセットする前の値です。 int setValue( int val</assert.h></stdio.h>…

【C++ ゲームプログラミング】タスクシステムの発展形

タスクが親子関係を持てるようにする タスクの親子関係で座標を相対的にする イベント伝搬の仕組みを導入する メッセージ送受信の仕組みを導入する 弱参照の仕組み タスクシステムという名前も発展させる まとめ 前回「タスクシステムからの脱却を考える」と…

【C++ ゲームプログラミング】タスクシステムからの脱却を考える

タスクシステムのメリット タスクシステムの問題点 タスクシステム不要論 タスクシステムが生まれた背景 タスクシステムがまだ有効な場面 小規模なゲーム 気合と根性がある場合 タスクシステムを大局的に使う場合 まとめ タスクシステムのメリット タスクシ…

【C++ ゲームプログラミング】STLで実装する最小のタスクシステム

タスクシステムとは 実装例 まとめ タスクシステムとは タスクシステムとはゲームプログラミングで利用されるプログラムの設計のことです。ゲームプログラムは更新処理と描画処理を繰り返すことで動作します。この更新処理と描画処理を小さな単位(タスク)に…

【C++ イディオム】メソッドチェイン + 引数のクラス化 = 名前付きパラメータイディオム

メソッドチェインと引数のクラス化 メソッドチェインとは 引数のクラス化 引数のクラス化とメソッドチェインを組み合わせる まとめ メソッドチェインと引数のクラス化 「メソッドチェイン」はメソッド(メンバ関数)を連続で呼び出す手法です。「引数のクラス…

【C++】メンバ関数には必要に応じてconstをつけよう

constメンバ関数 constメンバ関数のメリット constメンバ関数の使いどころ constメンバ関数内でもメンバ変数を変更したい場合 constメンバ関数の注意点 constメンバ関数のオーバーロード constメンバ関数を使うかどうかでソースコード全部に影響がでる const…

【C++】classとstructの違い

C++にはメンバを持てる存在が3つ存在します。それはclassとstructとunionです。unionはちょっと特殊なので置いておいて、classとstructにはどんな違いがあるのでしょうか。 違いはデフォルトのアクセス指定子のみ 実はclassとstructの違いはデフォルトのアク…

【C++ 小ネタ】文字列定数いろいろ

文字列定数とは 並んだ文字列定数は自動で連結される マクロ関数の引数を文字列化する 複数行の文字列定数を記述する 文字列定数とは "foo" ←これのことです。文字列リテラルとも呼ばれます。 並んだ文字列定数は自動で連結される 複数並んだ文字列定数は、…

【C++】短絡評価(ショートサーキット)を知ろう

短絡評価とは 短絡評価の例 なぜ短絡評価が存在するのか 短絡評価の使い道 ポインタと合わせて使う 軽い処理を先に持ってくる 短絡評価の注意点 まとめ 短絡評価とは 短絡評価とは論理演算子&&と||で行われる、式の評価の省略のことです。ショートサーキット…

【C++ 小ネタ】delete演算子とfree関数はNULLチェックは不要

delete演算子とfree関数はNULLチェックは不要 delete演算子とfree関数は、NULLを渡した場合、何も処理が行われないことが保証されています。なので以下のようなコードは、 if ( p ) { delete p; } このようにシンプルに書くことができます。 delete p; mallo…

【C++】条件演算子いろいろ

条件演算子のメリット 条件演算子の使いどころ 条件演算子ではなくif文を使うべきところ 条件演算子を入れ子にする 条件演算子の注意点 演算子の優先順序に気をつける 結果の型は同じである必要がある 三項演算子という呼び方 まとめ 条件演算子のメリット …

【C++ アイデア】const_castをちょっと楽にする

const_castはちょっと手間 const_on / const_off 関数を作る 使い方 まとめ const_castはちょっと手間 const_castはconstを付けたり外したりするためのキャストなのですが、ちょっと記述が面倒です。 class PlayerCharacter{}; const PlayerCharacter player…

【C++ イディオム】Pimplイディオムを使って真のprivateを実現する

privateが見えちゃってる問題 Pimplイディオムとは Pimplイディオムのメリット Pimplイディオムのデメリット プライベートクラスを一部に公開する Pimplイディオムを使う場面 Pimplイディオムの注意点 まとめ 参考リンク privateが見えちゃってる問題 C++の…

【C++】クラスの前方宣言いろいろ

クラスの前方宣言とは クラスの前方宣言の用途 ヘッダーでの別のヘッダのインクルードを減らす 相互参照を実現する クラスの前方宣言とポインタ変数の宣言を同時に行う クラス内でそのクラスの内部クラスの前方宣言 内部クラスの前方宣言にはクラスの定義が…

【C++ アイデア】ファイルのフォルダ分けをしつつ、ヘッダのインクルードを楽にする

ファイルのフォルダ分けをすると#includeが面倒になる問題 ファイルをフォルダ分けしたことによる問題 ファイルを移動したことによる問題 解決法?1: フォルダ分けを諦める 解決法?2: 楽に#includeをするのを諦める 解決法3: インクルードパスを設定する 解…