2009-08-01から1ヶ月間の記事一覧

引数有りコンストラクタを持つクラスを仮想継承する際の注意

ロベールのC++入門講座 13-04引数有りのコンストラクタを持つクラスを仮想継承し、それを多重継承した場合のお話です。以下の例を見てみましょう。 #include <iostream> using std::cout; using std::endl; class CBase { public: CBase (int num) { m_num = num; } in</iostream>…

IDirect3DDevice9オブジェクトの生成のリトライ

HRESULT hr; hr = lpd3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, // ハードウェア処理 hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING // HW頂点処理 &d3dpp, &lpD3ddev ); その1 初期化なんて怖くないぜ! これでデバイスの作成ができます。ただ…

基本的に初めにZeroMemory等で初期化した方が無難?

その1 初期化なんて怖くないぜ!ここを見ながら色々試してるのですが D3DPRESENT_PARAMETERS d3dpp; d3dpp.BackBufferWidth = 640; d3dpp.BackBufferHeight = 480; d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSa…

DirectXのReleaseメソッド

DirectX関連のクラスには大抵Releaseメソッドなるものが存在していて、オブジェクトの破棄をする際に呼ばないといけないようです。そこで処理を簡略化するためによくSAFE_RELEASEというような名前のマクロを用意すると便利らしいです。 #define SAFE_RELEASE…

ライブラリの追加

さてインストールも終わって色々サイトとか見ながら触ってたんですがDirectX3Dの初期化でいきなり躓く。 error LNK2019: 未解決の外部シンボル _Direct3DCreate9@4 が関数 "public: bool __thiscall DXClass::Init(void)" (?Init@DXClass@@QAE_NXZ) で参照さ…

クロスキャスト

ロベールのC++入門講座 13-08例えば以下のような多重継承の関係のクラスがあるとします。 class CBaseA { public: virtual ~CBaseA() {} }; class CBaseB { public: virtual ~CBaseB() {} }; class CSample : public CBaseA, public CBaseB {}; この状態でCB…

暗黙のキャスト

ロベールのC++入門講座 11-12 暗黙のキャストは思わぬバグを引き起こしてしまう可能性もあります。そのため、引数が一つになる可能性のあるコンストラクタがあれば、コピーコンストラクタを除いて、とりあえずはexplicitをつけておいたほうが無難です。 なる…

演算子のオーバーロードをフレンド関数に登録する

ロベールのC++入門講座 11-11グローバルな演算子のオーバーロードをするときに、その対象のクラスのプライベートな変数や関数が見えたほうが良いケースがあります。そういう場合のために予めクラス側で対象となる演算子のオーバーロードをフレンド関数に登録…

シングルトンクラス

ロベールのC++入門講座 11-03シングルトンクラスというものに関して言及がありました。コンストラクタをprivateにすることで外部でインスタンス化を不可能にし、そのクラスのオブジェクトが必ず一つしか存在しないことを保証するクラスのことをシングルトン…

頭が痛い

頭がガンガンする。もう歳なのかもしれない。

例外の再送出

ロベールのC++入門講座 10-05例外が発生して関数を抜ける前に何かしらの後処理がしたい場合、以下のように例外の再送出を使います。 #include <iostream> using std::cout; using std::endl; void func () { int* p = NULL; try { p = new int[10]; throw "エラー発生</iostream>…

DirectXのインストール

まずはインストールしないことには始まらない。Download DirectX Software Development Kit from Official Microsoft Download Center http://www.microsoft.com/downloads/details.aspx?FamilyId=4B9B1752-6F6C-440E-816C-35D247570AE4&displaylang=ja ここ…

とりあえず参考サイト

0からのゲームプログラミング ~ ゲームプログラマーへの第一歩を踏み出そう ~ マルペケつくろーどっとコム このあたりで勉強していこうかな。あと数学の勉強もそろそろ再開しないといけないですね。

DirectXとOpenGL

C++の勉強も順調に進んできたのでそろそろ手を出していこうかなと思います。これらのライブラリは今までの勉強の仕方のように頭から順に勉強していくスタイルでは無理があります。大量の型やクラスてんこもりなのでいちいち全部覚えてられないです。なのでま…

関数tryブロック

ロベールのC++入門講座 10-08コンストラクタの初期化子で発生した例外をキャッチする方法として関数tryブロックというものがあります。 #include <iostream> #include <string> using std::cout; using std::endl; class CSample { public: CSample (std::string str) try: m_s</string></iostream>…

テンプレート定義時のtypenameとclassの違い

ロベールのC++入門講座 09-02 template<typename T> ... と template<class T> ... において、動作の違いはまったくないそうです。ただし古いコンパイラではtypenameだと対応していない可能性があるらしいです。とりあえず本ブログではタイプ量の少ないclassを使っていきたいと思</class></typename>…

無名の名前空間

ロベールのC++入門講座 08-13namespaceを名前無しで定義すると無名の名前空間になります。 namespace { int i = 100; } こうして定義されたi変数はスコープがファイル内(ブロック内ではないことに注意)に限られます。 // -- main.cpp -- #include <iostream> namespa</iostream>…

別名の名前空間を定義する

ロベールのC++入門講座 08-13namespaceによる名前空間の別名を定義することができます。 #include <iostream> namespace FooBarBaz { int i = 10; } // 別名の定義 namespace FBB = FooBarBaz; int main () { // アクセスできる std::cout << FBB::i << std::endl; ret</iostream>…

std::swap、std::max、std::min

C++

http://www.geocities.jp/ky_webid/cpp/library/034.html補助的な関数です。 std::swap関数 値の入れ替えをするだけの関数です。 #include <iostream> #include <algorithm> using std::cout; using std::endl; int main () { int a = 10; int b = 20; cout << "a = " << a << end</algorithm></iostream>…

入出力ストリーム

C++

http://www.geocities.jp/ky_webid/cpp/library/029.html http://www.geocities.jp/ky_webid/cpp/library/030.html入出力ストリームの話です。ちょうど今ロベールで勉強してるところですね。実は今まで使用していたstd::coutというのはstd::ostreamクラスの…

アロケータ

C++

http://www.geocities.jp/ky_webid/cpp/library/028.htmlここはざっくり読み進めるだけにしておきます。基本的にはplacement newを使ってメモリプールから領域を確保することでnew/deleteの処理速度の低下を防ぐ目的だといえば早いでしょうか。(違うかもし…

テンプレートの実装のエクスポート

ロベールのC++入門講座 09-08テンプレートの実装をヘッダに書かなければならない理由 - (void*)Pないとの続きです。前回の記事でテンプレートの実装はヘッダで書かなければならないと言っていましたが、実はexportという指定子(?)を使えばヘッダに宣言だけを…

関数テンプレートにテンプレート引数のデフォルト値が渡せない理由

ロベールのC++入門講座 09-08前にテンプレートの勉強をした時に疑問に思ってた部分ですが、ロベール本で少し言及がありました。 実は関数テンプレートのテンプレート引数の場合はデフォルト引数をとることができません。これはおそらく、関数テンプレートの…

テンプレート引数の記述を省略する

ロベールのC++入門講座 09-07タイトルがちょっとわかり辛いですが、例を見ればすぐわかると思います。まず以下の処理を見てください。 template<class T> class CSample { public: CSample<T>& operator=(const CSample<T>& obj) { // 中身は適当。とりあえず自分自身を返し</t></t></class>…

テンプレートの実装をヘッダに書かなければならない理由

ロベールのC++入門講座 09-03ロベール本ではテンプレートの実装はヘッダに書かなければならないとさらりと書かれていましたが、何故そうしないといけないのかが本を読むだけでは今一良くわからなかったので色々調べてみたところ、理由がわかりました。まず宣…

バイナリモードでファイルの読み込み

ロベールのC++入門講座 08-09fstreamクラスを使ってのバイナリモードでファイルの読み込みをやってみます。 #include <iostream> #include <fstream> using std::cout; using std::endl; int main () { std::fstream file; char buf[16]; file.open("main.cpp",std::ios::in|std</fstream></iostream>…

バイトオーダー

ロベールのC++入門講座 08-08生データをバイナリモードで出力する場合、環境によってデータのバイトの並びが昇順になったり降順になったりするそうです。このバイトの並びのことをバイトオーダーと呼びます。そして昇順(左から右へ)の並びをビッグエンディア…

生データのファイル入出力

ロベールのC++入門講座 08-08C言語のときにもやりましたね。C++ではfstreamで同様のことが可能です。 #include <iostream> #include <fstream> #include <string> using std::cout; using std::endl; int main (int argc,const char* argv[]) { std::string type("w"); if ( argc >= 2 )</string></fstream></iostream>…

例外クラス

C++

http://www.geocities.jp/ky_webid/cpp/library/027.html標準で用意されている例外クラスの紹介がありました。どの例外クラスもstd::exceptionクラスから派生したものになっています。以下にその表を書いてみます。std::はスペースの都合上省きます。 except…

std::auto_ptrを自作する

C++

前回勉強したstd::auto_ptrですが、とても興味深い内容だったので自作してみました。myauto_ptrクラスです。 #include <iostream> #include <memory> using std::cout; using std::endl; template<class T> class myauto_ptr { public: myauto_ptr(T* p) { m_p = p; } myauto_ptr (const</class></memory></iostream>…