c++

unionを使って、ちょっと(いや、微かに)便利なVectorクラス

c++

union MyVec{ struct { int x, y, z; }; int v[3]; }; 構造体名を定義しないのがミソ。 定義した瞬間コンパイルエラーになってまいます。 こやつを使うと、 MyVec vec; vec.x = 0; vec.v[0] = 0; というように、2種類の方法でアクセスできます。

1桁の数字でも、頭に0をつけて、2桁にした文字列を作る方法。

c c++

もっと言うと、resoure_00,resoure_01といった名前を作る方法。 snprintf(name, sizeof(name), "resource_%02d", i); などとすればOK。%02dがポイント

C標準のrand関数の生成する乱数の下位bitの質は低いらしい。

c c++

コンパイラベンダー依存だと思うのだけど、 一般にC標準のrand関数の生成する乱数の下位bitの質は低いらしい。例えば、偶数と奇数が交互に出たりしちゃうらしい。なんで、以下のようなコードは御法度 rand() % N いろいろ調べると、書くなら、こう↓ (int)((…

親子間をまたいでのオーバーロード

c++

#include "stdio.h" #include "string.h" class Parent{ public: Parent(){ strcpy(name, "parent"); } virtual ~Parent(){} char name[256]; void hoge(int i){ printf("in parent hoge\n"); printf(" name: %s\n", name); } }; class Child : public Paren…

仮想関数のオーバーライドにおいて、返り値の型

c++

オーバーライドされる関数の返り値が、あるクラスのポインタ、もしくは参照であるとき、オーバーライドする関数の返り値の型は、派生クラスのポインタ、もしくは派生クラスの参照でもOKです。 つまり、以下のようなことができるということです。 struct RetB…

public, protected, private継承

c++

public継承 public -> public protected -> protected protected継承 public -> protected protected -> protected private継承 public -> private protected -> private っとなります。 また、継承元がprivateであれば、継承先ではアクセスできません。

constつけると関数別物

c++

const Vec2 &getPos() const; const Vec2 &getPos(); は、別物として扱われます。ただし、 const Vec2 &getPos(); Vec2 &getPos(); これらは、同一とみなされ、一緒に書くとコンパイルエラーとなります。 これはコンパイラが、引数では関数を区別するけど、…

constなオブジェクトを返す関数の必要性

c++

const Pos& getPos() {return mPos;} これだけだと、次のような場合に困るconst GameObj& obj = mObjMgr.getObj(); const Pos& pos = obj.getPos(); //コンパイルエラーこーいうときは、以下のような関数も作るとOK。const Pos& getPos() const {return mPos…

temlate引数におけるclassと、typenameの違い

c++

特に違いはない。どう使い分けるかは、個人の自由。 歴史的には、たしか最初にclassができて、その後、紛らわしいからtypenameができたという話が『C++の設計と進化』に書いてあった気がする。『Modern C++ Design』では、intのようなプリミティブな型になる…

text, data, bssセグメントのサイズを知る方法

c c++

sizeコマンドを使うsize 実行ファイル名 でOK text:プログラムが置かれた領域 data:初期化されたデータの置かれた領域 bss -> block started by symbol:初期化してない変数達の領域

コンストラクタ内での仮想関数の呼び出しはしちゃ駄目ー!

c++

コンストラクタが完了するまでは仮想関数の解決は基底クラスに従って行われます。 なので、呼ばないようにしましょう。解決策としては、initialize()関数を作って、そのなかで、仮想関数を呼ぶようにします。 オブジェクトを構築直後にinitialize()を呼び出…

メモリブロックについて

c++

newすると、アロケーターがメモリブロックを確保する。 ヒープを開放するときは、そのブロックごとに削除する。 newや、deleteすると、メモリブロックを検索しないとだめなので、newやdeleteは、結構時間がかかったりする。しばしば、クラスのサイズを小さく…

継承の際の、staticメンバ変数扱い

c++

class Hoge{ public: static int x; }; int Hoge::x = 10; class Piyo : public Hoge{ public: }; int main(){ printf("%p \n", &(Hoge::x)); printf("%p \n", &(Piyo::x)); } このコードにおいて、Hoge::xとPiyo::xは、まったく同じもの。

dynamic_castが適用されるのは?

c++

dynamic_castが適用されるのは、少なくとも一つのメンバ関数が仮想関数なクラスです。

RTTIとは?

c++

Run-Time Type Identification の略。 いっつも、なんの略だか忘れてしまう。 c⌒っ*゚д゚)っφ メモメモ...

maskをforで回すときにスマートに書く方法

c++

void hoge(int hoge_mask){ u32 mask = 1; int max = 10; for (int i = 0; i < max; i++, mask <<= 1) { if ((hoge_mask & mask) != 0) { //ここに、マスクを通ったものだけが行う処理を書く } } }

Modern Design読んでます。

c++

これを読んでいるとマジックを見てるような気分になります。 難解ですが、読み終わったら相当templateの使い方が変わりそう。しかし、ここに書かれているようなことを実践するとなると、コードが難解になりそう。 そのせいで、逆にバグが増えそうな気がする-…

strcmpの返り値

c++

strcmpは文字列が一致していると0を返す! 普通に考えたら逆だと思ってしまうけど。

iterator

c++

iteratorを実装する際は基本的に、前置++,--しか使わないようにするべきらしい。 後置++や--を実装するには、少しコストがかかるっぽい。

snprintf()の返り値は?

c++

snprintf()の返り値は、入った文字列の数でなく、入れようとした文字列の数を返します。 例えば、 char str[5]; int ret = snprintf(str, sizeof(str)), "hogegegege"); の場合、retは5でなくて、10。 うーん、紛らわしい…。

strcpyとstrncpyで、どっちがベター?

c++

以下の関数はバッファーオーバーランを起こす可能性があるので、使うべきではなく、→で示したほうの関数を使うべきとよく言われる。 sprintf → snprintf strcat → strncat strcpy → strncpy vsprintf → vsnprintf しかし、strncpyが安全かというと、そうでも…

placement new

c++

new(p) Hoge というように、newの引数にポインタを渡した場合、ポインタpの指す場所へオブジェクトを配置します。

namespaceの中括弧に;をつける?

c++

namespace { }; というように;を最後につけているコードを見かけることもあるが、『プログラミング言語c++第3版』では、;を書いてなかった。 んなので、書かないのが正しいっぽい。

find_if

c++

昨日、書いた関数オブジェクトを使うと、argorithmのfind_ifが使えます。以下は、例です。 #include <iostream> using namespace std; template<class T> struct Less_than{ T value; Less_than(const T& v) : value(v){} bool operator()(const T& v) const { return v</class></iostream>

関数オブジェクト

c++

関数オブジェクトとはなにか? 『C++の設計と進化』に書いてあるのをそのまま引用すると、「関数としての挙動を定義する適用演算子()を持つクラスのオブジェクト。」ということらしい。例えば、関数オブジェクトを使うと以下のようなコードが書けます。 #inc…

algorithm:find

c++

algorithm便利です。 今まで、使ってなかったのが悔やまれます。 しかも別にSTLのコンテナとかでなく、配列でも使えます。 より正確に言うならば、引数として渡すイテレータ対に、++、*、!=演算子が適当に設定されているなら使えます。 そんで、もちろん標準…

配列長の取得の仕方

c++

cで配列長を取得するときには、しばしば、 #define GET_ARRAY_LENGTH(array) sizeof(array) / sizeof(array[0]) cout << GET_ARRAY_LENGTH(array) << endl; // -> 100 などとします。 このマクロは固定長配列にしか使えないのですが、ついつい以下のようなコ…