C++

operator=()をoverrideできるのか?

C++

operator=()をoverrideできるのか? できるかできないかであれば、できる。 しかし、しない方が良いだろう。ベースクラスのポインターを保持する関数などで派生クラスを含めたコピーをしたい場合どうなるか。 確認をした。 なお今回のお題では呼び出し側での…

enumを基に変換関数を内蔵したオブジェクトをつくる

enumで定義されたデータをシリアライズするときは、何らかの数値(あるいは文字列)と相互変換する。 相手がintでC言語であれば、単純にキャストで相互変換もできる。C++であればstatic_castを使うこともあるだろう。 enum en { e1, e2, e3 }; en e = e3; int …

オブジェクト毎に内部インターフェースをカスタマイズする方法

複数のオブジェクトクラスに対して、同じ動作をさせるクラスの設計をすることがある。 例えば、ファイルへのIO処理はいろいろなオブジェクトを文字列かバイナリに相互変換させるクラスあるいは関数を設計する。 毎度個別に記述するのも良いが、もう少し簡便…

double版 powについて

先日powのint版を作成して、通常のpowを用いた場合と比較した。 今回はint版と同じアルゴリズムを用いたdouble版powと通常のpowを比較してみる。 ただし乗数は整数に限るとする。 double pow( double x, int exp ); かけ算のルーチンは以下の通り double pow…

整数版powについて

C言語、あるいはC++言語において累乗を計算する場合powを使う。幾つか亜種があるが標準で用意されているのは実数版のみだ。 最も一般的なpowの定義は以下の通り double pow( double x, double expr ); 整数版は用意されていないので、累乗が欲しいときには実…

ドロップターゲットのC++による実装の例

ドロップターゲットをC++で実装する例ドロップを抽象化するクラス。 動的生成で管理するならinitの内容をコンストラクターに移動するのもありだろう。 class TDropTarget; class TMyDrop { friend TDropTarget; private: HWND FHwnd; TDropTarget* FDropTarg…

Shell IDList Arrayについて

クリップボードフォーマットにおいて、Shell IDList Arrayを用いた通信について記事が少ないので一言。CIDAのフォーマットの定義は以下の通りだ。 typedef struct _IDA { UINT cidl; // IDLISTの数 UINT aoffset[1]; // IDLIST構造体のリスト } CIDA, * LPID…

Crypto APIによる暗号化

Crypto APIによる暗号化は、ちょっとした用途で暗号化強度がさほど必要でない場合に便利だ。 今回は文字列を暗号化・復号化するルーチンのサンプルを提示する。 もっと強度が必要な場合には、Cryptography API: Next Generationを用いるとよいようだ。 こち…

deleteをなくすには

deleteコードを減らすことは、複雑なコードの保守やリソースリークの観点で望ましい。下のようなコードでdeleteを消したい。 なお、new[]で確保した配列は、delete[]で削除しなければいけないことに注意。 class C { public: char* buf; unsigned int size; …

vectorとunique_ptr その3

vectorはコピーを使う、だからauto_ptrとおなじくunique_ptrは使えない。 以下のコードはコンパイルエラーが発生する。 vector<unique_ptr<C> > v; v.push_back( unique_ptr<C>( new C ) ); まれに、このコードをおすすめするHPが見られるが、コンパイルできるコンパイラーが</c></unique_ptr<c>…

vectorとunique_ptr その2

前回はコピーすべきところでムーブすべきではないことがわかった。 コードはshared_ptrを用いることで、すべてがうまくいくようになる。 class C { public: shared_ptr<int> d; C() : d(new int(0)) {} C( const int n ) : d(new int(n)) {} // コピーコンストラ</int>…

vectorとunique_ptr その1

vectorとunique_ptrの相性は悪い。 vectorはコピーが伴うものだし、unique_ptrはコピーコンストラクタを持たない。 以下のようなコードを考えてみる。 class C { public: int d; C() : d(0) {} C( const int n ) : d(n) {} ~C() {} }; void test_code() { ve…