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

c++

RAIIをC#でやるには?

RAIIとは? Resource Acquisition Is Initializationの略で、直訳すると"リソースの取得は初期時に"となります。これはC++やD言語で一般的なテクニックでリソースの取得と破棄を、変数のコンストラクタとデストラクタに関連付けて行うものです。例えば、下記…

テンプレート引数、typenameとclassの違いはある?

「Modern C++ Design」によると、基本的に違いはないらしい。ただ、規約では(何の規約かはよくわからないが…)、typenameは、intのようなプリミティブ型が渡されると期待されるものに対して使い、classはユーザ定義型が渡されると期待されるものに対して使わ…

ポリシークラスってなんぞや?〜その6〜

というわけで、ざっくりまとめると、多重継承とテンプレートを組み合わせることによって、とてつもない柔軟性をもったライブラリを作ることが可能なんだと。それの構成要素としてポリシーってものを定義する。 ってことなんだと思います。続きの1章1.5節…

ポリシークラスってなんぞや?〜その5〜

1章1.4節 テンプレートが希望の光を投げる(残り) ここで、多重継承の欠点と、テンプレートの欠点を見直すと、お互い相補的な関係にあることがわかる(らしい)。 多重継承にはメカニズムがないが、テンプレートには豊富なメカニズムがある 多重継承では、…

ポリシークラスってなんぞや?〜その5〜

1章1.4節 テンプレートが希望の光を投げる(後半) というわけで、テンプレートを使った際の問題点ですが、 構造を特殊化することはできません。 メンバ関数の特殊化はスケーラビリティがありません。 ライブラリの開発者は複数のデフォルト値を提供できま…

ポリシークラスってなんぞや?〜その4〜

テンプレートが希望の光を投げる んでは、テンプレートを使ったらどうか? テンプレートは、ユーザが提供した型に基づいて、コンパイル時点でコードを生成するため、 組み合わせによる様々な動作に対応するための良い素材となります。うんうん。たしかに、テ…

ポリシークラスってなんぞや?〜その3〜

1章 1.3 多重継承で解決できるのか? 多重継承によって、選択の組み合わせの爆発的な増加に対応するという手が考えられます。 例えば、Temporaryクラスと、Secretaryクラスを継承してTemporarySecretaryを作ったり、BaseSmartPtrと、RefCountedと、MultiThre…

ポリシークラスってなんぞや?〜その2〜

1章 1.2 何でもやっちゃえインターフェースの失敗(後半) 異なった設計ごとに小さなクラスを用意してみたら?の失敗 例えば、スマートポインタの場合、SingleThreadSmartPtr、MultiThreadedSmartPtr、RefCountedSmartPtr、RefLinkedSmartPtrといって一連の…

ポリシークラスってなんぞや?〜その1〜

「Modern C++ Design」を、わからないなりにとりあえずガーッと読んだ。 けど、ほんと分からん。 とりあえず、ポリシークラスの考えが、わかったようで分かってないので、1つ1つ確認してみることに。 1章 1.2 何でもやっちゃえインターフェースの失敗 クラ…

部分配列で、その和が最大になるものを求める〜その4〜

最後に、走査アルゴリズムというのを実装してみました。 例によって詳細は「珠玉のプログラミング」に載っているのですが、簡単に説明すると、x[0...n]までの部分配列の最大和は、x[0...n-1]の部分配列の最大和か、x[n]から左方向に伸びた配列の和のいずれか…

部分配列で、その和が最大になるものを求める〜その2その3〜

昨日のアルゴリズムからループ一つ減らしたもの。 #include <iostream> #include <boost/random.hpp> #include "autoStopWatch.h" using namespace std; using namespace boost; const int ARRAY_LENGTH = 10000; float x[ARRAY_LENGTH]; //部分和を総当たりで調べて、和の最大を求める関</boost/random.hpp></iostream>…

部分配列で、その和が最大になるものを求める〜その1〜

珠玉のプログラミングで取り上げられていた問題を、実際に解いてみる。問題: 1次元のパターン認識の問題。n要素の浮動小数点の配列xを入力とし、配列xの連続した要素(部分配列)でその和が最大になるものを見つけて、その和を出力する。たとえば、 2,-3…

Hoge* a, b, c;って書いちゃ駄目

c c++

これだとaのみポインタになってしまう。この歳になっても、意外と、やってしまう。a,b,c全てをポインタとして扱いたい場合は、Hoge *a, *b, *c;

二分探索

c c++

二分探索は意外と難しいと『珠玉のプログラミング』に書いていたので、実際書いてみました。 #include <iostream> using namespace std; int sorted_array[10] = { //テスト用に適当なソート済みデータをでっちあげ -1,0,1,2,3,4,5,6,7,8 }; struct BinarySearchError{</iostream>…

-Iオプションでヘッダーパス指定

いまさら感満載ですが、gccでは、-Iオプションでヘッダーパスを指定できます。例えば、cygwinで、boostをincludeしたいときだったら、 g++ -I C:/cygwin/usr/include/boost-1_33 main.cppとか。 また、C:/cygwinは省略しても良いらしく g++ -I/usr/include/b…

cygwinでboost使おうと試みた

試しに、 #include <boost/lambda/bind.hpp> としても、no fileとか言われてうまくいかん。cygwin/user/includeフォルダをみてみると、boostは、 cygwin/user/include/boost-1_33/boost/... に入っている模様。 #include <boost-1_33/boost/lambda/bind.hpp> としてみたら、こんどはbind.hppの中での他のhppをincludeし</boost-1_33/boost/lambda/bind.hpp></boost/lambda/bind.hpp>…

問:0..n-1からm個の整数をランダムに選び出し、ランダムに出力するプログラムを作れ

ごり押し。長文。ださいorz #include <iostream> #include <vector> using namespace std; const int n = 11; const int m = 10; vector<int> container; int rand_n(int n){ return rand() % n; } //重複true ノット重複false bool repetition_check(int i){ vector<int>::iterator it =</int></int></vector></iostream>…

Local Class

c++

あまり知られていませんが、関数内でもクラスを宣言することができます。例えば、こんな感じで↓ void func(){ class Hoge{ }; } このクラスは、絶対に継承できません。なんで、これを使うと、c++でも、finalなクラスを作ることができそうです。例えば、こん…

シンプルなコンパイル時アサート

c++

template<bool> struct StaticErrorChecker; template<> struct StaticErrorChecker<true>{}; #define STATIC_ASSERT(expr) (StaticErrorChecker<(expr) != 0>()) int main(){ const bool true_flag = true; const bool false_flag = false; STATIC_ASSERT(true_flag); /</true></bool>…

自己消滅型ストップウォッチ

c++

ちょっとしたコードテスト用に作ってみた。 struct AutoStopWatch{ AutoStopWatch(){ mStartTime = clock(); } ~AutoStopWatch(){ std::cout << "time : " << (static_cast<double>(clock() - mStartTime) / CLOCKS_PER_SEC) << std::endl; } clock_t mStartTime; };</double>

クラスの関数のポインタを渡す

c++

class Hoge{ void piyo(); }; だとすると、 void (Hoge::*p)() = &Hoge::piyo; というようにする

できあがった実行ファイルの、各セグメントのサイズを知る方法

c c++

sizeコマンドを使うと、分かります。 size a.exeでOK。text,data,bss各セグメントのサイズが表示されます。 ちなみに、それぞれtext ->プログラムの本体(命令コード) data ->初期化済みデータの格納領域 bss ->未初期化データの格納領域だったはず…。

robust iterator

c++

iterate中に、removeとかinsertとかできるiteratorをrobust iteratorと言うらしい。 たぶん。

ifの()の中で変数を宣言できる。

c++

例えば、以下のようなコードが書ける。 #include <iostream> using namespace std; struct Base{ virtual void func() = 0; }; struct A : public Base{ virtual void func(){}; }; struct B : public Base{ virtual void func(){}; }; struct C : public Base{ virtua</iostream>…

仮想継承とは

c++

多重継承の際 a a | | b c \ / dこーせず、 a / \ b c \ / dこーしたいときに、 class b : public virtual a { }; class c : public virtual a { }; とすると、実現できます。 これを仮想継承といいます。

shared_ptrを使った場合に起きる、相互参照によるメモリリークを防ぐためにはweak_ptrを使う。

c++

参考↓ http://d.hatena.ne.jp/naoya/20051012/1129115986相互に参照している部分をweak_ptrを使えば、余分なcountがされないので、大丈夫。 けど、できれば、こういう設計自体をしないほうが良い。たぶん。

デストラクタを、virtualにすべきとき、すべきでないとき

c++

virtualにしてると仮想関数テーブルを経由する分、関数へのアクセスは遅くなる。シビアに速度UPが要求されるような場面で、かつ頻繁に破壊と構築が行われるような場合は、できるだけデストラクタをvirtualにしない方が良いと思われ。あと、vptrの分メモリ食…

volatile修飾詞は、最適化を防ぐ

c++

コンパイラの最適化機能は、マルチスレッドプログラミングとかだと、不具合を起こす可能性があります。 mValue = 1; while(mValue){ ... //この中でmValueを変えるようなことはしない } 例えば、コンパイラは、しばしば上記のようなコードを、最適化によって…

実は、constへのポインタに対してdelete演算ができる

c++

constへのポインタに対してdelete演算ができるということを、最近知りました。 だから、以下のようなこともできてしまいます。 struct Hoge{ }; int main(){ const Hoge* p_hoge = new Hoge; delete p_hoge; return 0; } だから、どーしたってことはないんで…

newを場所に応じて使い分けることってできんのだろうか?

c++

なんとかnewを、場所に応じて使い分けることができんものかと、試行錯誤をしてみたのですが、どうにもうまくいかない。 #include <iostream> namespace WKPN1{ void* operator new(size_t size) throw() { using namespace std; cout << "wkpn1" << size << endl; retu</iostream>…

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。 うーん、紛らわしい…。