C++プログラマ キャスブログ
[C++]クラスの中身が空でもサイズは1バイト 2014年12月21日12:38:32
クラスの中身に何も書かなくてもサイズは1バイト取られます。 中身が空だといって油断しないようにしましょう。 クラスの配列を生成した時にアドレスを変える必要があるので 最小単位(1バイト)のメモリが確保されています。
1 2 3 4 5 6 7 8 9 10 11 12 #include <cstdio> // printfに必要なヘッダー class A { }; int main() { printf( "%d\n", sizeof(A) ); return 0; }
出力: 1
余談ですが、要素数0の配列は作れます。
1 2 3 4 5 6 7 8 9 10 #include <cstdio> // printfに必要なヘッダー int main() { int* i = new int[0]; delete[] i; return 0; }
[C++]C++で書くシングルトンクラス 2014年12月16日22:00:34
シンプルに書き表したシングルトンクラスです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Singleton { private: Singleton() { } virtual ~Singleton() { } public: static Singleton* GetInstance() { static Singleton instance; return &instance; } };
インスタンスの生成・解放を抑止するためにコンストラクタ・デストラクタは privateに指定します。 問題はインスタンスを取得するためのGetInstanceメソッドです。 ガーベジコレクションが完備されている言語であれば、初回時のGetInstanceの内部で newを利用してインスタンスを生成するのが一般的でしょう。 しかし、今回はガーベジコレクションの無いC++です。 newした場合、解放するタイミングを見失ってしまいます。 別途Releaseメソッドを設けるのもいいですがダサいです。 そこでstatic変数を利用してインスタンスを生成するのがいいことに気づきます。 これであればプログラム終了時に自動的に解放されることが約束されます。 参照カウンタ付きのスマートポインタを返すという手段も考えられますが 用途に対して大げさなので、static変数を使うので十分でしょう。 戻り値については、お好みに応じて参照を返すのかポインタを返すのかは 書き換えて頂ければいいのではないかと考えています。
[C++11]auto変数とconst_iterator 2014年12月12日22:30:43
自動で型推論をしてくれるauto変数ですがイテレータを扱う時には注意が必要です。 auto変数はconst_iteratorなのか普通のiteratorか判別がつかないので 普通にbeginを書くとconst_iteratorにはなりません。 そこでC++11から追加されたcbeginを使えばconst_iteratorを返してくれます。 終端のconst_iteratorはcendです。普通に回す分には今まで通りendで問題ありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <cstdio> // printfに必要なヘッダー #include <array> //std::arrayに必要なヘッダー int main() { std::array<int,5> arr = { 1, 2, 3, 4, 5 }; auto ite1 = arr.begin(); // iterator auto ite2 = arr.cbegin(); // const_iterator printf( "%s\n", typeid(ite1).name() ); printf( "%s\n", typeid(ite2).name() ); return 0; }
出力: class std::_Array_iterator class std::_Array_const_iterator
const_iteratorを利用したループの書き方 ※単純にループするだけならforeachをオススメします。 イテレータは削除や挿入が必要な場合に利用するのがいいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <cstdio> // printfに必要なヘッダー #include <array> //std::arrayに必要なヘッダー int main() { std::array<int,5> arr = { 1, 2, 3, 4, 5 }; // ite != arr.end()でも動きます。 for( auto ite=arr.cbegin(); ite != arr.cend(); ++ite ) { printf( "%d\n", *ite ); } return 0; }
auto変数についての説明はこちら [C++11]auto変数を使おう!ただし慎重に... foreachについての説明はこちら [C++11]イテレータとはおさらばforeach
カテゴリ

リンク
C++11のコードを
試すのに便利です。
http://ideone.com/

同人ゲームを
製作している知人
sorcery

にほんブログ村 IT技術ブログ C/C++へ
にほんブログ村


C++ ブログランキングへ

ゲームダウンロード DefenceTri