C++

MacOSXにeclipseを導入する

2011/8/5 MacOSX 10.7 Lion にeclipse 3.7(Indigo)をインストールする手順です。 同時にプラグインをいくつか入れてみましたのでメモしておきました。ところどころ端折っています。 eclipseのインストール 公式サイトからJava開発環境をダウンロード → http:…

XRCを使うのに必要なlib

wxWidgetsでXRCを使うのに"wxmsw28d_xrc.lib"だけリンクさせれば十分だと思ったのですが、コンパイルが通らなかったので色々試したところ以下のライブラリをリンクするとうまくいきました。 Debugビルド wxmsw28d_xrc.lib wxbase28d_xml.lib wxmsw28d_adv.li…

wxWidgetsを使ってみよう

C++

VC++ 2008 ExpressでwxWidgetsを使うための設定方法をまとめてみました。(2010/9/11時点の情報) 参考サイト: http://wiki.wxwidgets.org/Microsoft_Visual_C%2B%2B_Guide wxWidgetsとは wxWidgetsとはC++でGUIを作成することができるクロスプラットフォーム…

テンプレートメタプログラミング(ループ)

ループの基本形です。テンプレート引数をデクリメントして再帰的に呼び出すことで実現することができます。 template <int N>struct UNROLL { static void iteration(int i) { cout<< i <<endl; UNROLL<N-1>::iteration(i+1); } }; template <> struct UNROLL<0>{ static void iterati</endl;></int>…

テンプレートメタプログラミング (条件分岐)

条件分岐 コンパイル時に条件分岐を行うためのテンプレートの使い方です。 テンプレート引数にtrueまたはflaseを指定すると、それぞれ100,200が代入されるようにしてみます。 //テンプレート引数にtrueを入れた場合 cout << 100 << endl;//100 //テンプレー…

テンプレートを使って配列を作る

静的な配列をコンパイル時に作成するための簡単なコードです。テンプレートを使わずに要素数を自由に指定するなら、#define文などで要素数を定義するか、new・deleteでヒープ領域に要素数だけ確保することになると思います。テンプレートの仕組みを利用する…

テンプレートを使って簡単な漸化式を計算する

コンパイル時に値を計算するための方法についてです。フィボナッチ数列を例にとってみましょう。 この数列の答えはこのようになります。 n 0 1 2 3 4 5 6 7 8 ... 1 1 2 3 5 8 13 21 34 ... 実際に4つほど書き下したものが下の式です。 これに対応するコード…

テンプレートメタプログラミング

定数 コンパイル時に定数を代入する方法を考えてみます。 Step0 コンパイル後の式がこのようになるためにはどうすればいいでしょうか? cout << 1 << endl; enumで適当な変数名を定義すれば、コンパイル時にプリプロセッサが勝手に数字に置き換えてくれます…

テンプレート関数とテンプレートクラス

テンプレートを使った関数とクラスについてのまとめです。 テンプレートが必要な理由 float型の要素を持つベクトルと、int型の要素をもつベクトルを作成することを考えてみます。ベクトル同士の演算は型に依存しない処理ですが、それぞれの型に対してfVector…

ビューポート変換の式

2次元ワールド座標から2次元ディスプレイ座標への変換式のメモです。 行列を使わずに直接計算しています。 class ViewportTransform{ protected: //Device(Screen)座標系における原点座標 float m_screenOriginX; float m_screenOriginY; //倍率 screen / wo…

C++で複素数クラスを作成する

STLのcomplexクラスについて C++で複素数を扱うにはSTLで用意されているcomplexクラスを利用します。complexクラスはテンプレートで定義されているので、型を指定して扱うことができます。例えば、double型の複素数を扱いたい場合は、complexと記述します。 …

STLのalgorithmの練習1

STLのalgorithmを使うと、vectorやlistなどのコンテナに対してソートや置き換え、検索などを簡単に行うことができます。algorithmが提供している関数ごとに違いはありますが、大まかな書式は次のようになります。 std::<関数名>(<前iteretor>,<後ろiteretor>,…

inline関数をヘッダに書く際の注意点

inlineメンバ関数を含むクラスを作成するときにヘッダと実装ファイルを作成する方法について。 下のように、2つのcppファイルで利用するクラスAを作成するとしましょう。 main.cpp #include "A.h" int main(){ A a; a.method(); return 0; } A.hA.cpp #ifnde…

C++で2次元アフィン変換クラスを作る

2次元座標においてある点を別の点に移す変換のなかで、下の基本変換の合成変換として表現できるものをアフィン変換と呼びます。 例えば、(1,2)だけ平行移動させて、原点を中心に30°回転させる変換は、と表すことができます。 平行移動(x: ,y: ) 拡大縮小 回…

C++で作るベクトルクラス その2

3次元版を作っていて気づいたこと。 ベクトルクラスを作るときに、x,y,zというメンバを使ってコードを書くか、配列v[i]を利用してコードを書くか迷うところですが、3次元ならx,y,zを使って書いた方が分かりやすいかもしれません。↓ Vector3D.h class Vector3…

C++で作る行列クラス その1

3×3の行列クラスを作ってみます。 こちらも、できるだけ数式に近い形で扱いたいということで演算子のオーバーロードを使って実装してみます。行列クラスをこんな感じで使うのが目標。 Matrix3D A( 1, 0, 0, 0, 1, 0, 0, 0, 1 ); Matrix3D B( 2, 3, 4, 3, 5, …

簡単にウインドウを作成するコード その2

ウインドウを簡単に作成するコード その1 - white wheelsのメモのつづき Windowクラスを作成しましたが、残念ながらstaticなWindowProcedureの中では、静的でない変数やメソッドを利用することができません... WindowProcedureの中でWindowBaseインスタンス…

ウインドウを簡単に作成するコード その1

Windowsでウインドウを一つ開いて何か処理を行うコードを簡単に書くにはどうすればよいのか実験してみました。 完成させたいコードのイメージ。↓OpenFrameworksっぽくしてみたい WindowBaseがAppBaseを持っていて、マウスに反応してAppBaseのイベント処理を…

線形リストを作ってみる その4 〜色リスト遊び

リストの中にクラスのインスタンスを入れてみます。 線形リストをウインドウに表示させることを想定して、それぞれのノードに位置と色の情報を保持させてみます。 位置情報は、C++でベクトルクラスを作成する〜その1 - white wheelsのメモで作成したVector2D…

コピーコンストラクタと代入演算子が呼び出されるタイミング

オブジェクトのコピー インスタンスをコピーする際にはコピーコンストラクタと呼ばれるコンストラクタが暗黙のうちに呼び出されています。コピーコンストラクタと代入演算子を明示して実際に呼び出されているタイミングを確認してみます。次のArrayクラスの…

コピーコンストラクタの使い方について

コピーコンストラクタが必要な場合について考えてみます。 インスタンスのコピー クラスのインスタンスはメンバ変数を持っており、それぞれの値がメモリに保存されています。インスタンスをコピーすると、メンバ変数の値も丸ごとコピーされることになります…

線形リストを作ってみる その3

その2の続き。。。 線形リストのようなデータ構造は、int型以外にもfloat,double,boolなどいろいろな型を扱うことができると便利です。いろいろな数値型を扱えるように改造してみたいと思います。 Nodeクラスのテンプレートクラス化 Nodeに好きな型を入れら…

C++でベクトルクラスを作成する〜その1

演算子のオーバーロードを使って簡単なベクトルクラス(2D)を作ってみます。下のようにソース内に直接"+"や"-"を書いて簡単に計算できるようなクラスを目標にしてみたいと思います。 Vector u(1,2); Vector v(3,4); cout<< u + v <

線形リストを作ってみる その2

線形リストを作ってみる その1 - white wheelsのメモの続き。 push_back(最後尾に要素を挿入する), pop_back(最後尾の要素を削除する)を加え、好きな位置のノードにアクセスできるようにしてみます。 線形リストver2 List.h #ifndef __List_H #define __Lis…

線形リストを作ってみる その1

線形リストは、鎖のようにデータが連なったデータ構造をとります。 --[data]--[data]--[data]--[data]-- 線形リストの形には直線型、循環型があり、データを取り出せる方向として一方向、双方向の二種類に分かれます。 一方向の場合は前のノードを参照するこ…

文法備忘録C++編

C++基本文法のごくごくごく一部。 コメント //comment /*comment*/ 変数と宣言 int x,y; const double z;//定数 static int r;//静的変数 配列 1次元配列 int a[3];//宣言 a[0]=0;//要素へのアクセス 2次元配列 int a[3][2]={{1,2},{3,4},{5,6}}; a[0][1]=0;…

constメンバ関数について

constなオブジェトを扱う場合、メンバ変数を書き換られてはconstではなくなってしまいます。const性を保証するには、外部から呼び出されるメンバ関数によってメンバ変数が書き換えられないという条件を付けなければいけません。そこで登場するのがconstメン…

C++で演算子のオーバーロード

operator演算子 C++では自分の好きなように演算子を定義することができます。 例えばSTLでお馴染みのstringクラスでは、"+="演算子を利用して文字の連結処理を行うことができます。 string str1="sunny"; string str2=" day"; str1+= str2; //str1に"sunny d…